GitHub創建遠程倉庫
配置多個SSH-key
當公司gitlab和自己的github都要配置ssh-key時,假設公司的已存在,現在添加自己GitHub的ssh-key
#名字隨意,與公司的區分開來就好
$ ssh-keygen -t rsa -C "youremail@xx.com" -f ~/.ssh/id-rsa-github
此時在~/.ssh下會生成id-rsa-github和id-rsa-github.pub文件
然后添加私鑰
$ ssh-add ~/.ssh/id-rsa-github
# 如果執行ssh-add報錯,就執行一下ssh-agent -s再執行ssh-add
接著在~/.ssh下添加config文件,輸入如下內容
#gitlab
Host gitlab.yourhost.com #企業gitlab host
HostName gitlab.yourhost.com #企業gitlab host
PreferredAuthentications publickey
IdentityFile ~/.ssh/id_rsa
# github
Host github.com
HostName github.com
PreferredAuthentications publickey
IdentityFile ~/.ssh/id_rsa_github
GitHub添加key
右上角點擊頭像,選擇settings進入配置頁面,選擇SSH and GPG keys,添加SSH key
測試是否生效
ssh -T git@github.com
創建本地倉庫
從遠程倉庫克隆
git clone git@url.git
執行git clone 后,會在本地創建master分支,并自動關聯遠程的master分支。
常見工作流程
- 從遠程倉庫克隆副本
- 在本地修改或添加文件
- 如果遠程倉庫更新了,本地可以更新資源
- 提交前查看修改
- 提交修改
- 提交完修改后,如果發現錯誤,可以撤回提交,并再次修改提交
git工作區、暫存區、版本庫
- 工作區:用戶操作區,就是本地看到的目錄
- 緩存區:英文叫stage或者index,所以有時候緩存區也叫索引,只有index里的內容才可以被commit
-
版本庫:HEAD指向的工作區有一個隱藏目錄.git,這個不算工作區,而是Git的版本庫
當對工作區的修改內容執行git add
之后,暫存區的目錄樹會更新,同時工作區中的修改內容會被寫入到objects(對象庫)中的一個新對象中,而該對象的ID被記錄到暫存區的文件索引中。
當執行git commit
時,暫存區的目錄樹寫到版本庫(對象庫)中,當前分支會做相應的更新
基本操作
新建遠程分支
# 新建并切換本地分支
git checkout -b newBranchName
# 推送到遠程分支
git push origin newBranchName:newBranchName
刪除遠程分支
git push origin :deleteBranchName
# 或者
git push origin --delete deleteBranchName
待補充……
常見問題
1、在工作區做了修改,不想要了
在工作區修改后,如果想要恢復修改前的版本,執行git checkout .
或git checkout -- <file>
即可將暫存區的全部或指定文件替換工作區的文件
2、提交到暫存區的修改想要撤回
當工作區修改的內容執行git add
添加到暫存區后,如果想要撤回,執行git reset HEAD
后,暫存區的目錄樹會被重寫,被當前分支(HEAD指向的分支)的目錄樹替換,工作區的不受影響。
如果希望將工作區和緩存區的修改內容都恢復到未修改前,執行git checkout HEAD .
或者git checkout HEAD <file>
則可將HEAD指向的分支的全部或者指定文件替換緩存區和工作區中的文件。該動作十分危險,會同時清除工作區和緩存區的未提交修改。
3、提交到版本庫中的修改想要撤回
已經執行gti commit
提交修改到版本庫,此時想要撤回修改,可通過以下方法:
(1)執行git reset --soft HEAD^
,只撤銷commit操作,不影響暫存區和工作區。HEAD^
表示上個版本,也可以寫成HEAD~1
(2)執行git reset --hard HEAD^
,撤銷commit和add操作,并且刪除工作區改動,恢復到上一次commit版本
(3)執行git reset --mixed HEAD^
,撤銷commit和add操作,但不刪除工作區改動。--mixed
為默認參數,git reset HEAD^
與git reset --mixed HEAD^
效果一樣。
4、checkout、reset、revert的區別
待補充……
5、工作區中已作修改時,更新遠程倉庫代碼
- 放棄本地修改
# 獲取遠程分支(步驟1)
git fetch origin branchName
# 在(步驟1)基礎上,創建新分支
git checkout -b branchName origin/branchName
# 在(步驟1)基礎上,重置HEAD指向
git reset --hard origin/branchName
- 獲取最新的遠程代碼,并合并到當前分支
(1)git pull origin branchName
,拉取遠程origin/branchName分支合并到當前分支,該方法直接合并,無法處理沖突
(2)git fetch + git merge
拉取遠程分支后手動合并,推薦該方法
# 拉取遠程分支branchName到本地
git fetch origin branchName
# 合并branchName到當前分支
git merge origin/branchName