【git】git 入门使用手册
文章目錄
- 一、git 是什么
- 二、git 簡(jiǎn)單使用
- 2.1 創(chuàng)建版本庫(kù)(可被git追蹤的庫(kù))
- 2.2 git 把文件添加到版本庫(kù)
- 2.3 把版本庫(kù)中的文件提交到倉(cāng)庫(kù)
- 2.4 修改文件并查看修改,提交
- 2.5 查看多個(gè)版本每次分別修改了什么內(nèi)容
- 三、版本修改和管理
- 3.1 回退版本
- 3.2 工作區(qū)和暫存區(qū)
- 3.3 撤銷修改
- 3.4 刪除文件
- 四、遠(yuǎn)程倉(cāng)庫(kù)
- 4.1 生成 ssh key 并添加到遠(yuǎn)程倉(cāng)庫(kù)
- 4.2 本地倉(cāng)庫(kù)推送遠(yuǎn)程
- 4.3 從遠(yuǎn)程克隆倉(cāng)庫(kù)
- 五、分支管理
- 5.1 創(chuàng)建與合并分支
- 5.2 解決沖突
- 5.3 rebase
- 六、常用命令
- 七、問題記錄
一、git 是什么
分布式版本控制系統(tǒng)
官網(wǎng):https://git-scm.com/book/zh/v2
二、git 簡(jiǎn)單使用
2.1 創(chuàng)建版本庫(kù)(可被git追蹤的庫(kù))
# 1、新建文件夾 mkdir learngit # 2、將該文件夾變成可被git管理的倉(cāng)庫(kù) git init執(zhí)行后,learngit文件夾就變成了一個(gè)可以被管理的倉(cāng)庫(kù)了,且這個(gè)目錄下會(huì)出現(xiàn)一個(gè).git/目錄,是git用來(lái)跟蹤和管理版本庫(kù)的。如果沒看到,則是被隱藏了,可以使用ls -ah來(lái)看。
2.2 git 把文件添加到版本庫(kù)
# 把文件夾下的所有文件都添加 git add . # 添加特定的文件 git add xxx.py2.3 把版本庫(kù)中的文件提交到倉(cāng)庫(kù)
# -m 后面是本次提交的說(shuō)明,最好說(shuō)清本次提交修改或添加了什么 git commit -m "add an python file" # 修改上一次的commit,這會(huì)算一次commit git commit -amend --no-edit輸入該命令后,成功后會(huì)返回
- 1 file changed:一個(gè)文件被改動(dòng)
- 2 insertions:插入了兩行內(nèi)容
- 1 delations:刪除了一行內(nèi)容
2.4 修改文件并查看修改,提交
# 查看倉(cāng)庫(kù)當(dāng)前狀態(tài) git status # 查看被修改文件的具體修改內(nèi)容 git diff xxx.py # 修改后先 add git add . # 查看倉(cāng)庫(kù)狀態(tài) git status # 然后 commit git commit -m "add distributed" # 再次查看狀態(tài) (nothing to commit, working tree clean) git status2.5 查看多個(gè)版本每次分別修改了什么內(nèi)容
# 查看每次修改,從近到遠(yuǎn)顯示,顯示每次commit id,和commit的注釋 git log # 簡(jiǎn)單顯示 git log --pretty=onelinecommit id 是SHA1計(jì)算出來(lái)的一個(gè)非常大的數(shù)字,用十六進(jìn)制表示,因?yàn)間it是分布式的版本控制系統(tǒng),如果簡(jiǎn)單的使用1,2,3作為版本號(hào),會(huì)多人沖突。
三、版本修改和管理
3.1 回退版本
如果想回退版本,git必須知道回退到哪個(gè)版本,git的版本都是按提交順序管理的,HEAD 表示當(dāng)前版本,也就是最新提交的,上一個(gè)版本是 HEAD^,上上個(gè)版本是 HEAD^^ 或 HEAD~2,以此類推。
# 回退到上個(gè)版本,會(huì)返回 HEAD is now at ... git reset --hard HEAD^回退完之后,所有的文件會(huì)恢復(fù)到上一次提交的內(nèi)容。
回退到特定版本,這個(gè)時(shí)候要先用 git log 看 commit id,用 commit id 來(lái)回退
# 回退到某個(gè)特定的版本,版本號(hào)只寫前幾位就可以了,git會(huì)自動(dòng)找到 git reset --hard 1094a如果回退到了舊版本,但是又想恢復(fù)到新版本怎么辦?
-
第一種方法是回退之前,先打一下 git log,把所有的 commit id 都打出來(lái),然后恢復(fù)的時(shí)候使用新版本的 commit id 來(lái)恢復(fù)就可以了。
-
第二種方法是使用git reflog,打出來(lái)你的每一次命令,從這找 commit id 就可以
3.2 工作區(qū)和暫存區(qū)
工作區(qū)(working directory): 就是電腦里能看到的目錄,比如 learngit 文件夾就是一個(gè)工作區(qū)
版本庫(kù)(Repository): 工作區(qū)有一個(gè)目錄 .git/,這個(gè)目錄不算工作區(qū),而是 git 的版本庫(kù),版本庫(kù)存了下面的東西:
- stage(index)——暫存區(qū)
- git 自動(dòng)創(chuàng)建的分支 master
- 指向 master 的指針 HEAD
- git add:把工作區(qū)的文件添加到版本庫(kù)的暫存區(qū)
- git commit:把暫存區(qū)的東西提交到當(dāng)前分支,可以 add 多次,然后執(zhí)行commit一次,把暫存區(qū)的所有的內(nèi)容都提交上去,暫存區(qū)就啥都沒啦
提交之后,如果沒有修改任何東西,git status 后看到的就是:nothing to commit, working tree clean
如果做了兩次修改,確只add了一次,然后 commit 了,怎么辦:繼續(xù) add,然后再 commit
# 第一次修改,然后 add git add xxx.py # 第二次修改,沒有 add,直接commit了 git commit -m "modified: xxx.py"然后會(huì)發(fā)現(xiàn)第二次修改的沒有被提交,因?yàn)槊看翁峤欢贾粫?huì)提交暫存區(qū)中的東西,第二次修改又沒被放入暫存區(qū),所以只提交了第一次的修改。
提交后,可以用 git diff HEAD --xxx.py 來(lái)查看工作區(qū)和版本庫(kù)中的區(qū)別
正常流程:
第一次修改→ git add →第二次修改→ git add → git commit
也就是說(shuō),如果每次修改,不用 git add 放到暫存區(qū),則就不會(huì)加入到 commit 中。
3.3 撤銷修改
改亂了工作區(qū)的文件,想直接丟棄時(shí):
- 如果還沒放到緩存區(qū):git checkout -- xxx.py,就可以把文件在工作區(qū)的修改全部撤銷
- 如果已經(jīng)放到了緩存區(qū):
- ① git reset HEAD xxx.py ,git reset 既可以回退版本,也可以把暫存區(qū)的修改回退到工作區(qū),HEAD 表示最新版本。
- ② git checkout -- xxx.py
- 如果已經(jīng)提交:git reset --hard xxx.py
git reset HEAD :暫存區(qū)的目錄樹會(huì)被重寫,被 master 分支指向的目錄樹所替換,但是工作區(qū)不受影響。
git rm --cached <file> :會(huì)直接從暫存區(qū)刪除文件,工作區(qū)則不做出改變。也就是僅從跟蹤清單中刪除,工作區(qū)不受影響。
git checkout . 或者 git checkout -- <file> :會(huì)用暫存區(qū)全部或指定的文件替換工作區(qū)的文件。這個(gè)操作很危險(xiǎn),會(huì)清除工作區(qū)中未添加到暫存區(qū)的改動(dòng)。
git checkout HEAD . 或者 git checkout HEAD <file> :會(huì)用 HEAD 指向的 master 分支中的全部或者部分文件替換暫存區(qū)和以及工作區(qū)中的文件。這個(gè)命令也是極具危險(xiǎn)性的,因?yàn)椴坏珪?huì)清除工作區(qū)中未提交的改動(dòng),也會(huì)清除暫存區(qū)中未提交的改動(dòng)。
3.4 刪除文件
在工作區(qū)中刪除了文件:
rm xxx.py如果真的要?jiǎng)h,則要把版本庫(kù)中的也刪掉:
# 1、從版本庫(kù)中刪除文件 git rm xxx.py # 2、提交刪除 git commit -m "remove xxx.py"如果工作區(qū)誤刪了,則可以從版本庫(kù)中恢復(fù)到工作區(qū),git checkout 其實(shí)是用版本庫(kù)中的版本替換工作區(qū)的版本,無(wú)論工作區(qū)里邊是修改還是刪除了,都可以還原到版本庫(kù)中的版本:
git checkout -- xxx.py四、遠(yuǎn)程倉(cāng)庫(kù)
4.1 生成 ssh key 并添加到遠(yuǎn)程倉(cāng)庫(kù)
ssh-keygen -t rsa -C "xxx@example.com"然后一路回車,就可以在 ~/.ssh/中生成 id_rsa 和 id_rsa.pub,前者是私匙,不能泄露,后者是公匙,可以公開。
復(fù)制 id_rsa.pub 中的內(nèi)容,添加到 github、gitlab、服務(wù)器等設(shè)備里邊,就可以推送遠(yuǎn)端倉(cāng)庫(kù)了。因?yàn)檫h(yuǎn)端倉(cāng)庫(kù)要識(shí)別出提交確實(shí)是你的電腦。
一個(gè)設(shè)備也可以多加幾個(gè) key,也就是多個(gè)電腦的key都可以添加到 github。
4.2 本地倉(cāng)庫(kù)推送遠(yuǎn)程
在本地 learngit 倉(cāng)庫(kù)下運(yùn)行下面的命令,把遠(yuǎn)程倉(cāng)庫(kù)和本地倉(cāng)庫(kù)關(guān)聯(lián):
git remote add origin git@github.com:wang/learngit.git添加后,遠(yuǎn)程倉(cāng)庫(kù)的名字就是 origin。
下一步,就可以推送到遠(yuǎn)程倉(cāng)庫(kù)了
# 第一次推送 git push -u origin master由于遠(yuǎn)程庫(kù)是空的,我們第一次推送master分支時(shí),加上了-u參數(shù),Git不但會(huì)把本地的master分支內(nèi)容推送的遠(yuǎn)程新的master分支,還會(huì)把本地的master分支和遠(yuǎn)程的master分支關(guān)聯(lián)起來(lái),在以后的推送或者拉取時(shí)就可以簡(jiǎn)化命令。
# 后面的推送 git push origin master刪除遠(yuǎn)程庫(kù):
如果添加的時(shí)候地址寫錯(cuò)了,或者要?jiǎng)h除本地庫(kù)和遠(yuǎn)程庫(kù)的連接:
# 查看遠(yuǎn)程庫(kù)信息 git remote -v # 刪除遠(yuǎn)程庫(kù)連接 git remote rm origin4.3 從遠(yuǎn)程克隆倉(cāng)庫(kù)
git clone git@github.com:wang/learngit.gitGit支持多種協(xié)議,包括https,但ssh協(xié)議速度最快。
五、分支管理
5.1 創(chuàng)建與合并分支
創(chuàng)建分支:
# 1 -b: 表示創(chuàng)建分支并切換 git checkout -b dev # 2 先創(chuàng)建再切換 git branch dev git checkout dev查看當(dāng)前分支,當(dāng)前分支前面有 *:
git branch * devmaster創(chuàng)建 readme.txt 并提交:
git add readme.txt git commit -m "branch test"從 dev 切回 master 分支:
git checkout master把dev上的修改合并到master上:
git merge dev刪除 dev 分支:
git branch -d dev因?yàn)閯?chuàng)建、合并和刪除分支非常快,所以Git鼓勵(lì)你使用分支完成某個(gè)任務(wù),合并后再刪掉分支,這和直接在master分支上工作效果是一樣的,但過(guò)程更安全。
使用 switch 來(lái)切換分支:
# 創(chuàng)建并切換到新分支 git switch -c dev # 直接切換到已有的分支 git switch master查看分支:git branch
創(chuàng)建分支:git branch <name>
切換分支:git checkout <name>或者git switch <name>
創(chuàng)建+切換分支:git checkout -b <name>或者git switch -c <name>
合并某分支到當(dāng)前分支:git merge <name>
刪除分支:git branch -d <name>
5.2 解決沖突
如果在 dev 分支上修改了 readme.txt ,master 分支上也修改了 readme.txt,合并會(huì)出現(xiàn)以下問題:
# dev 分支 git switch dev git add readme.txt git commit -m "change the last row of readme.txt to AND" # master 分支 git switch master git add readme.txt git commit -m "change the last row of readme.txt to &" # 合并 git merge dev問題:
Auto-merging readme.txt CONFLICT (content): Merge conflict in readme.txt Automatic merge failed; fix conflicts and then commit the result也就是 readme.txt 文件存在沖突了,必須手動(dòng)解決后再提交,
Git在有沖突的文件里邊會(huì)用<<<<<<<,=======,>>>>>>>標(biāo)記出不同分支的內(nèi)容,可以修改一個(gè)分支的內(nèi)容后,保存,再提交。
git add readme.txt git commit -m "conflict fixed"查看分支合并情況:
git log --graph --pretty=oneline --abbrev-commit5.3 rebase
多人協(xié)作時(shí),很容易出現(xiàn)沖突,后 push 的人要先 pull 一下,在本地合并后,才能 push 成功。
$ git log --graph --pretty=oneline --abbrev-commit * 582d922 (HEAD -> master) add author * 8875536 add comment * d1be385 (origin/master) init hello * e5e69f1 Merge branch 'dev' |\ | * 57c53ab (origin/dev, dev) fix env conflict | |\ | | * 7a5e5dd add env | * | 7bd91f1 add new env ...- (HEAD -> master):表示當(dāng)前分支的 HEAD,582d922
- (origin/master):遠(yuǎn)程 origin 的位置, d1be385
可以看出本地分支比遠(yuǎn)程分支快兩個(gè)提交(本地在遠(yuǎn)程前面兩行),也可以用 git status 來(lái)看:
$ git status On branch master Your branch is ahead of 'origin/master' by 2 commits. (use 'git push' to publish your local commits)也就是提交歷史分叉了,可以使用 git rebase,rebase 操作可以把本地未push的分叉提交歷史整理成直線。
Your branch and ‘origin/indoor_sundries_detection’ have diverged,
and have 1 and 1 different commits each, respectively.
pull 報(bào)錯(cuò) Found a swap file by the name “.git/.MERGE_MSG.swp”
cd .git/ rm -rf MERGE_MSG獲取commit id
# 最近一次 git rev-parse HEAD # 最近兩次 git rev-parse HEAD~2六、常用命令
創(chuàng)建倉(cāng)庫(kù):
1、git init <directory>:帶參數(shù)則在指定目錄下創(chuàng)建,不帶參數(shù)則在當(dāng)前目錄創(chuàng)建
2、git clone <repo> :克隆指定的 repo 到本地當(dāng)前目錄
3、git add:添加文件到暫存區(qū)
4、git commit -m “<message>”:提交暫存區(qū)的文件到本地倉(cāng)庫(kù)
5、git commit --amend --no-edit:將當(dāng)前staged修改合并到最近一次的commit
5、git status:顯示當(dāng)前文件信息(staged、unstaged、untracked)
查看不同:
1、git diff:比較工作區(qū)和暫存區(qū)的修改
2、git diff HEAD:比較工作區(qū)和上一次 commit 后的修改
3、git diff --cached:比較暫存區(qū)和上一次 commit 后的修改
查看 log:
1、git log:查看歷史提交記錄
2、git log --oneline:簡(jiǎn)潔查看
3、git log --graph:展現(xiàn)什么時(shí)候出現(xiàn)分支、合并
4、git reverse --oneline:逆向顯示所有日志
5、git log --author=wang --oneline -5:展示wang修改的5行
6、git reflog:查看本地倉(cāng)庫(kù)的所有日志
移除修改:
1、git reset:移除暫存區(qū)所有修改
2、git reset --hard:移除暫存區(qū)所有修改,并強(qiáng)制刪除所有工作區(qū)的修改
3、git reset <commit>:將當(dāng)前分支回滾到指定 ,清除暫存區(qū)修改,保存工作區(qū)不變
4、git rest --hard <commit>:將當(dāng)前分支回滾到指定,清除暫存區(qū)所有修改,并強(qiáng)制刪除工作區(qū)所有修改
七、問題記錄
1、change xxx closed
上一次的push已經(jīng)被merge,出現(xiàn)無(wú)法push的情況,解決方法:
# 使用 git reflog 查看commit的記錄 git reflog把push成功的那次 commit id 復(fù)制下來(lái),然后soft回退:
git reset --soft xxx之后重新commit和push即可
2、HEAD -> refs/for/indoor_sundries_nes (n/a (unpacker error))
使用下面的方法 push:
git push --no-thin origin HEAD:refs/for/indoor_sundries_nes3、Your branch and 'origin/master' have diverged, and have 1 and 1 different commits each, respectively.
使用 git status查看狀態(tài),顯示上述問題,則可以使用下面命令解決
git rebase origin/master git pull --rebase4、You are currently editing a commit while rebasing branch 'pre-master' on 'f236bf72'.
Last commands done (9 commands done):pick da34a9a9 fix load modelpick 8f7d7bc5 add model and region(see more in file .git/rebase-merge/done) No commands remaining. You are currently editing a commit while rebasing branch 'pre-master' on 'f236bf72'.(use "git commit --amend" to amend the current commit)(use "git rebase --continue" once you are satisfied with your changes)使用 git rebase --quit 解決
On branch detect_sundries Your branch is up to date with 'origin/detect_sundries'.nothing to commit, working tree clean總結(jié)
以上是生活随笔為你收集整理的【git】git 入门使用手册的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 快iPhone一步?郭明錤:苹果明年将推
- 下一篇: 【实例分割】cvpr2021_Look