wordpress文章圖片函數(shù)企業(yè)seo排名哪家好
文章目錄
- 簡介
- 前置概念
- .git目錄
- objects目錄
- refs目錄
- HEAD文件
- reset
- reflog 與 reset --hard
- revert(撤銷指定提交)
- stash
- diff
- 工作區(qū)與暫存區(qū)差異
- 暫存區(qū)與HEAD差異
- 工作區(qū)與HEAD差異
- 其他比較
- restore、checkout(代碼撤回)
- merge、rebase、cherry-pick
簡介
本文將介紹Git幾個核心概念,和最常用的幾個內容操作命令:
- reset
- diff
- restore、checkout
- stash
- reflog
- revert
- cherry-pick(merge、rebase)
前置概念
首先我們來看一下幾個非常重要的前置概念
.git目錄
git init
我們執(zhí)行上面命令就會生成一個.git目錄
【工作區(qū)】add就到【暫存區(qū)】commit就到【本地倉庫】
objects目錄
objects目錄中保存的是add到暫存區(qū)和commit到本地倉庫的文件
refs目錄
HEAD文件
HEAD是一個文本文件,你們內容是HEAD當前指向的分支:
ref: refs/heads/feature-view
reset
我們首先來看一下我們最常用的reset操作。
reset是重置,他重置的是commit
git reset [–soft | --mixed | --hard] HEAD
- –mixed:默認參數(shù),撤銷commit,所有commit和沒有commit的代碼放到工作區(qū)
- –soft:撤銷commit,所有commit和沒有commit的代碼放到暫存區(qū)
- –hard:撤銷commit,丟棄所有commit、工作區(qū)、暫存區(qū)代碼
# head表示當前版本,head^等價于head~1表示回退所有內容到上一個版本
git reset head^# 回退2個版本
git reset head~2# 將tree.txt這個文件的版本到上一個版本
git reset head^ tree.txt# 回退到指定commit,commit-id:4889036387
git reset 4889036387
我們最最常用的reset的2個操作:
- 感覺自己的commit有點問題,想重新commit,這個也可以用git commit --amend
- 自己push之前有提交,導致push失敗,pull之前要reset,這里可以用–soft參數(shù),這樣如果沒有沖突就不用再add了
reset多個版本的這種操作不建議做,除非沒有push到遠程倉庫,或者只有你一個人在提交代碼。
如果修改了遠程倉庫的commit,通常push是不行的,必須使用git push -f。
git push -f是一個非常危險的操作,會導致push之前,其他人push的新代碼丟失
git提示可以使用,是讓我們知道自己在干什么,而不是告訴我們git push不行,用git push -f 吧。
一般來說,規(guī)范的團隊都會把git push -f給禁用掉,不然一個人騷操作,代碼丟了,可能啥證據都沒有。
reflog 與 reset --hard
如果不小心執(zhí)行了reset --hard,有機會補救嗎?
git reset --hard head~2
答案是還能搶救一下:
首先:
git reflog
再使用git reset --hard回退到reset的上一個版本
git reset --hard 8ca4549
commit的內容回來了,但是工作區(qū)和暫存區(qū)的內容掉了,找不回了
revert(撤銷指定提交)
revert是用來將某次的commit的內容,提取出來到工作區(qū)。
這樣就可以重新編輯,然后再一次提交。
主要使用場景就是:發(fā)現(xiàn)自己某一次提交有點問題,但是在這次提交之前已經有其他人提交了,怎么辦呢?
可以用revert
# 查看提交記錄
git log --oneline
# 撤銷指定的提交
git log revert b1c305d
revert并不會修改指定的commit,只會根據指定commit做逆操作
可以checkout到指定commit,看到內容并沒有少:
git checkout -b feature-view b1c305d
revert相當于將指定的commit合并到當前的head,還可能沖突。
所以,通常來說還不說直接改。唯一的作用可能就是記不清楚的commit的內容的時候,可以revert能自動幫你做。
stash
stash最常用的場景2個:
- 我們切分支的時候,有時候有修改不能切,就可以stash暫存
- pull代碼沖突,就可以先stash 再pull
# 默認暫存
git stash# 添加暫存提示信息
git stash save "暫存提示信息"# 查看暫存了哪些內容
git stash list# 查看最上面的暫存修改了哪些文件
git stash show
# 查看第2個暫存修改了哪些文件
git stash show stash@{1}# 查看最上面的暫存修改的具體內容
git stash show -p
# 查看第2個暫存修改的具體內容
git stash show stash@{1} -p# 應用最上面的暫存,不刪除
git stash apply
# 應用第2個暫存
git stash apply stash@{1} # 應用最上面暫存,并刪除(沒有沖突才刪除)
git stash pop
# 應用第2個暫存,并刪除(沒有沖突才刪除)
git stash pop stash@{1}# 刪除最上面暫存
git stash drop
# 刪除第2個暫存
git stash drop stash@{1}# 刪除所有暫存
git stash clear
diff
工作區(qū)與暫存區(qū)差異
git diff
git diff b.txt# 暫存區(qū)的文件在objects中,可以通過下面的命令查看
git cat-file -p 8fec8c3
# 工作區(qū)的對象還沒有在objects中,會提示找不到對象
git cat-file -p 04a9f41# 可以通過HEAD查看已經commit的對象
git cat-file -p HEAD:b.txt
git cat-file -p d1d06ad
暫存區(qū)與HEAD差異
暫存區(qū)(stage)HEAD是當前分支最新的commit
git diff --cached
git diff --cached b.txt
工作區(qū)與HEAD差異
HEAD是當前分支最新的commit(通常就是master),也可以使用指定的commit-id
git diff HEAD
git diff HEAD b.txt# 工作區(qū)與指定commit的差異
git diff commit-id
其他比較
# 查看兩個commit之間的差異
git diff commit-id1 commit-id2# 查看不同分支的文件差異
git diff branch-name1:file-path branch-name2:file-path
restore、checkout(代碼撤回)
推薦使用restore,checkout還是讓他去切分支吧。
restore是有遞進關系:
- 可以從暫存區(qū)撤回到工作區(qū)使用–staged參數(shù)(相當于add的逆操作)
- 可以直接丟棄工作區(qū)的修改
# 丟棄工作區(qū)的修改
git restore a.txt
# 等價于
git checkout a.txt
# 丟棄工作區(qū)和暫存區(qū)所有修改,不能指定文件,指定文件就等價于git checkout filename.txt
git checkout -f# 將暫存區(qū)回退到工作區(qū)
git restore --staged a.txt
merge、rebase、cherry-pick
merge、rebase、cherry-pick主要是操作commit:
- merge合并代碼,注意合并解決沖突就可以
- rebase,優(yōu)化commit,注意修改的開始commit之后沒有其他人的提交就可以(如果提示需要git push -f時一定要注意)
- cherry-pick是從其他分支挑選commit到當前分支
這里我們重點說一下cherry-pick,比如一個任務我已經開發(fā)了一段時間了,但是臨時需要發(fā)一個修復版本,但是修復版本使用了我開發(fā)這段時間的代碼,這么辦呢?
這個時候就可以使用cherry-pick。
如果有沖突,先解決沖突:
繼續(xù)cherry-pick:
# 首先切到指定分支
git checkout b1
# 查看需要pick哪些提交
git log --oneline# 切回到pick分支
git checkout master# cherry-pick指定的commit
git cherry-pick 1f54b01 0fed6dd# 如果有沖突手動解決沖突,然后add
git add .# 繼續(xù)cherry-pick處理commit信息
git cherry-pick --continue