【git】git 入门使用手册
文章目錄
- 一、git 是什么
- 二、git 簡單使用
- 2.1 創(chuàng)建版本庫(可被git追蹤的庫)
- 2.2 git 把文件添加到版本庫
- 2.3 把版本庫中的文件提交到倉庫
- 2.4 修改文件并查看修改,提交
- 2.5 查看多個版本每次分別修改了什么內容
- 三、版本修改和管理
- 3.1 回退版本
- 3.2 工作區(qū)和暫存區(qū)
- 3.3 撤銷修改
- 3.4 刪除文件
- 四、遠程倉庫
- 4.1 生成 ssh key 并添加到遠程倉庫
- 4.2 本地倉庫推送遠程
- 4.3 從遠程克隆倉庫
- 五、分支管理
- 5.1 創(chuàng)建與合并分支
- 5.2 解決沖突
- 5.3 rebase
- 六、常用命令
- 七、問題記錄
一、git 是什么
分布式版本控制系統(tǒng)
官網(wǎng):https://git-scm.com/book/zh/v2
二、git 簡單使用
2.1 創(chuàng)建版本庫(可被git追蹤的庫)
# 1、新建文件夾 mkdir learngit # 2、將該文件夾變成可被git管理的倉庫 git init執(zhí)行后,learngit文件夾就變成了一個可以被管理的倉庫了,且這個目錄下會出現(xiàn)一個.git/目錄,是git用來跟蹤和管理版本庫的。如果沒看到,則是被隱藏了,可以使用ls -ah來看。
2.2 git 把文件添加到版本庫
# 把文件夾下的所有文件都添加 git add . # 添加特定的文件 git add xxx.py2.3 把版本庫中的文件提交到倉庫
# -m 后面是本次提交的說明,最好說清本次提交修改或添加了什么 git commit -m "add an python file" # 修改上一次的commit,這會算一次commit git commit -amend --no-edit輸入該命令后,成功后會返回
- 1 file changed:一個文件被改動
- 2 insertions:插入了兩行內容
- 1 delations:刪除了一行內容
2.4 修改文件并查看修改,提交
# 查看倉庫當前狀態(tài) git status # 查看被修改文件的具體修改內容 git diff xxx.py # 修改后先 add git add . # 查看倉庫狀態(tài) git status # 然后 commit git commit -m "add distributed" # 再次查看狀態(tài) (nothing to commit, working tree clean) git status2.5 查看多個版本每次分別修改了什么內容
# 查看每次修改,從近到遠顯示,顯示每次commit id,和commit的注釋 git log # 簡單顯示 git log --pretty=onelinecommit id 是SHA1計算出來的一個非常大的數(shù)字,用十六進制表示,因為git是分布式的版本控制系統(tǒng),如果簡單的使用1,2,3作為版本號,會多人沖突。
三、版本修改和管理
3.1 回退版本
如果想回退版本,git必須知道回退到哪個版本,git的版本都是按提交順序管理的,HEAD 表示當前版本,也就是最新提交的,上一個版本是 HEAD^,上上個版本是 HEAD^^ 或 HEAD~2,以此類推。
# 回退到上個版本,會返回 HEAD is now at ... git reset --hard HEAD^回退完之后,所有的文件會恢復到上一次提交的內容。
回退到特定版本,這個時候要先用 git log 看 commit id,用 commit id 來回退
# 回退到某個特定的版本,版本號只寫前幾位就可以了,git會自動找到 git reset --hard 1094a如果回退到了舊版本,但是又想恢復到新版本怎么辦?
-
第一種方法是回退之前,先打一下 git log,把所有的 commit id 都打出來,然后恢復的時候使用新版本的 commit id 來恢復就可以了。
-
第二種方法是使用git reflog,打出來你的每一次命令,從這找 commit id 就可以
3.2 工作區(qū)和暫存區(qū)
工作區(qū)(working directory): 就是電腦里能看到的目錄,比如 learngit 文件夾就是一個工作區(qū)
版本庫(Repository): 工作區(qū)有一個目錄 .git/,這個目錄不算工作區(qū),而是 git 的版本庫,版本庫存了下面的東西:
- stage(index)——暫存區(qū)
- git 自動創(chuàng)建的分支 master
- 指向 master 的指針 HEAD
- git add:把工作區(qū)的文件添加到版本庫的暫存區(qū)
- git commit:把暫存區(qū)的東西提交到當前分支,可以 add 多次,然后執(zhí)行commit一次,把暫存區(qū)的所有的內容都提交上去,暫存區(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"然后會發(fā)現(xiàn)第二次修改的沒有被提交,因為每次提交都只會提交暫存區(qū)中的東西,第二次修改又沒被放入暫存區(qū),所以只提交了第一次的修改。
提交后,可以用 git diff HEAD --xxx.py 來查看工作區(qū)和版本庫中的區(qū)別
正常流程:
第一次修改→ git add →第二次修改→ git add → git commit
也就是說,如果每次修改,不用 git add 放到暫存區(qū),則就不會加入到 commit 中。
3.3 撤銷修改
改亂了工作區(qū)的文件,想直接丟棄時:
- 如果還沒放到緩存區(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ū)的目錄樹會被重寫,被 master 分支指向的目錄樹所替換,但是工作區(qū)不受影響。
git rm --cached <file> :會直接從暫存區(qū)刪除文件,工作區(qū)則不做出改變。也就是僅從跟蹤清單中刪除,工作區(qū)不受影響。
git checkout . 或者 git checkout -- <file> :會用暫存區(qū)全部或指定的文件替換工作區(qū)的文件。這個操作很危險,會清除工作區(qū)中未添加到暫存區(qū)的改動。
git checkout HEAD . 或者 git checkout HEAD <file> :會用 HEAD 指向的 master 分支中的全部或者部分文件替換暫存區(qū)和以及工作區(qū)中的文件。這個命令也是極具危險性的,因為不但會清除工作區(qū)中未提交的改動,也會清除暫存區(qū)中未提交的改動。
3.4 刪除文件
在工作區(qū)中刪除了文件:
rm xxx.py如果真的要刪,則要把版本庫中的也刪掉:
# 1、從版本庫中刪除文件 git rm xxx.py # 2、提交刪除 git commit -m "remove xxx.py"如果工作區(qū)誤刪了,則可以從版本庫中恢復到工作區(qū),git checkout 其實是用版本庫中的版本替換工作區(qū)的版本,無論工作區(qū)里邊是修改還是刪除了,都可以還原到版本庫中的版本:
git checkout -- xxx.py四、遠程倉庫
4.1 生成 ssh key 并添加到遠程倉庫
ssh-keygen -t rsa -C "xxx@example.com"然后一路回車,就可以在 ~/.ssh/中生成 id_rsa 和 id_rsa.pub,前者是私匙,不能泄露,后者是公匙,可以公開。
復制 id_rsa.pub 中的內容,添加到 github、gitlab、服務器等設備里邊,就可以推送遠端倉庫了。因為遠端倉庫要識別出提交確實是你的電腦。
一個設備也可以多加幾個 key,也就是多個電腦的key都可以添加到 github。
4.2 本地倉庫推送遠程
在本地 learngit 倉庫下運行下面的命令,把遠程倉庫和本地倉庫關聯(lián):
git remote add origin git@github.com:wang/learngit.git添加后,遠程倉庫的名字就是 origin。
下一步,就可以推送到遠程倉庫了
# 第一次推送 git push -u origin master由于遠程庫是空的,我們第一次推送master分支時,加上了-u參數(shù),Git不但會把本地的master分支內容推送的遠程新的master分支,還會把本地的master分支和遠程的master分支關聯(lián)起來,在以后的推送或者拉取時就可以簡化命令。
# 后面的推送 git push origin master刪除遠程庫:
如果添加的時候地址寫錯了,或者要刪除本地庫和遠程庫的連接:
# 查看遠程庫信息 git remote -v # 刪除遠程庫連接 git remote rm origin4.3 從遠程克隆倉庫
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查看當前分支,當前分支前面有 *:
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因為創(chuàng)建、合并和刪除分支非常快,所以Git鼓勵你使用分支完成某個任務,合并后再刪掉分支,這和直接在master分支上工作效果是一樣的,但過程更安全。
使用 switch 來切換分支:
# 創(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>
合并某分支到當前分支:git merge <name>
刪除分支:git branch -d <name>
5.2 解決沖突
如果在 dev 分支上修改了 readme.txt ,master 分支上也修改了 readme.txt,合并會出現(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 文件存在沖突了,必須手動解決后再提交,
Git在有沖突的文件里邊會用<<<<<<<,=======,>>>>>>>標記出不同分支的內容,可以修改一個分支的內容后,保存,再提交。
git add readme.txt git commit -m "conflict fixed"查看分支合并情況:
git log --graph --pretty=oneline --abbrev-commit5.3 rebase
多人協(xié)作時,很容易出現(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):表示當前分支的 HEAD,582d922
- (origin/master):遠程 origin 的位置, d1be385
可以看出本地分支比遠程分支快兩個提交(本地在遠程前面兩行),也可以用 git status 來看:
$ 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 報錯 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)建倉庫:
1、git init <directory>:帶參數(shù)則在指定目錄下創(chuàng)建,不帶參數(shù)則在當前目錄創(chuàng)建
2、git clone <repo> :克隆指定的 repo 到本地當前目錄
3、git add:添加文件到暫存區(qū)
4、git commit -m “<message>”:提交暫存區(qū)的文件到本地倉庫
5、git commit --amend --no-edit:將當前staged修改合并到最近一次的commit
5、git status:顯示當前文件信息(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:簡潔查看
3、git log --graph:展現(xiàn)什么時候出現(xiàn)分支、合并
4、git reverse --oneline:逆向顯示所有日志
5、git log --author=wang --oneline -5:展示wang修改的5行
6、git reflog:查看本地倉庫的所有日志
移除修改:
1、git reset:移除暫存區(qū)所有修改
2、git reset --hard:移除暫存區(qū)所有修改,并強制刪除所有工作區(qū)的修改
3、git reset <commit>:將當前分支回滾到指定 ,清除暫存區(qū)修改,保存工作區(qū)不變
4、git rest --hard <commit>:將當前分支回滾到指定,清除暫存區(qū)所有修改,并強制刪除工作區(qū)所有修改
七、問題記錄
1、change xxx closed
上一次的push已經(jīng)被merge,出現(xiàn)無法push的情況,解決方法:
# 使用 git reflog 查看commit的記錄 git reflog把push成功的那次 commit id 復制下來,然后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總結
以上是生活随笔為你收集整理的【git】git 入门使用手册的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 快iPhone一步?郭明錤:苹果明年将推
- 下一篇: 【实例分割】cvpr2021_Look