日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 >

git命令行(2)

發布時間:2023/12/15 45 豆豆
生活随笔 收集整理的這篇文章主要介紹了 git命令行(2) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

一、父提交的表示方法

1.HEAD引用

在.git/HEAD目錄下存在一個HEAD文件,其記錄著當前工作區對應的SHA1。如果當前工作區從某個分支檢出(checkout),那么這個HEAD文件中的引用最終執行分支對應的SHA1,如果處于分離頭狀態(不對應分支,從某個commit檢查),那么這個HEAD文件中保存的就是檢出的commit SHA1。

如果我們直接使用git checkout master分支,那么HEAD的值為ref: refs/heads/master。指向.git/refs/heads/master文件,其內容就是m6對應的SHA1。
如果我們使用git checkout ${m4.sha1} ,那么HEAD的值為 ${m4.sha1}
因此HEAD引用就是當前工作區對應的提交的SHA1

2.父提交的表示方法

可以使用~(波浪號)和^號表示父提交,但含義會略有不同。
</br>
^表示父提交的第幾個提交,后面如果跟數字就是表示第幾個父提交。
例如上圖中當前的工作區HEAD指向m10提交。那么HEAD^和HEAD^1相同都是指向m9。HEAD^^指向m8,而HEAD^2則是沒有意義的,因為m10只有一個父提交就是m9。HEAD^^^指向是m7,HEAD^^^2指向d2(HEAD^^指向m8,后面的^2表示m8的第二個父提交)。分析^的時候如果^號后面沒有數字則和^1等價,表示第一個父提交,如果存在數字就表示第幾個父提交。
tips:如果^后面的形式如:^{commit},^{tree},^{blob},則表示當前對象的提交、樹、blob對象。
</br>
~表示法:波浪號表示父提交的層次關系。那么HEAD~和HEAD~1相同都是指向m9。HEAD~ ~指向m8,而HEAD~2和HEAD~\~是完全等價的。HEAD~\~\~指向是m7,HEAD~3和其等價。因此d2就可以表示為HEAD~2^2(HEAD~2指向m8,后面的^2表示m8的第二個父提交),因此如果存在數字表示父提交的父提交的父提交...(數字就是幾層父提交)

因此當我們使用git log命令的時候,可以打印部分父提交。
git log --oneline HEAD~8..HEAD~5

3.git reflog

當我們對任何的分支修改(commit、pull、push)的時候,在.git/logs/refs目錄都會記錄變更情況,因此完全不用擔心提交記錄丟失的情況。.git/logs/refs/heads記錄本地分支的變更記錄,.git\logs\refs\remotes記錄遠程分支在本地的變更情況。
當我們使用git reflog命令的時候就會顯示HEAD引用的變更情況。

同樣可以通過git reflog master查看master分支的變更情況。
reflog表示法:HEAD@{1},表示HEAD引用之前的第一個變更。

git reset --hard HEAD@{1}。如果新拉取的代碼有問題,但是拉取之前的代碼不確定是否有問題,需要把代碼回滾到拉取之前的代碼,那么就可以執行這個命令

二、修改提交

本地提交代碼的時候經常會出現需要更改提交、修改注釋的情況,下面的幾個命令可以實現修改提交。

1.git commit

git commit --amend可以方便的修改當前提及的注釋。當執行這個命令的時候會彈出vim編輯器編輯注釋信息(只修改提交注釋信息)。

2.git reset

git reset命令可以把當前分支重置到某個提交。其選項有三個:

  • --hard:把工作區、暫存區的內容也重置到該提交
  • --mixed:默認選項,把暫存器的內容重置到該提交,但是保留當前工作區的內容
  • --soft:工作區、暫存器保留原來的內容,分支的引用重置到某個提交

3.git revert

如果我們的提交已經push到遠程倉庫上,別人已經pull下來了,如果你想刪除某次提交,reset就不能使用了,而是使用revert命令,revert即對某次提交產生一個反作用的提交。

git revert HEAD~3 -----創建一個提交,回滾最近的第四次提交 git revert master~5..master~2 ---回滾某個范圍的提交

4.git rebase

git rebase可以對當前沒有push的提交進行更改,設想一下一個功能你可以本地進行了多次提交,但是push的時候你想把這些提×××并成一個,就可以使用git rebase命令編輯提交。
假設我們需要對如下m9-m13的提交編輯。

場景一:把這些提交并成一個提交

使用squash命令和上一個提×××并,然后重新修改提交日志

場景二:刪除某個提交
刪除某個提交直接把該提交對應的行去除或者使用remove命令。如果存在合并沖突,然后解決沖突。


根據git命令行的提示,解決完沖突以后運行git add添加沖突的修改。

場景三:修改某個提交的日志:
使用edit命令或者reword命令修改,最好使用reword命令,這樣rebase就可以之間彈出修改日志的vim編輯器,而不用git 彈出git commit --amend提示。

三、分支標簽命令

1.git branch

使用branch命令可以管理分支。

$ git branch ------顯示本地分支 $git branch -a -------顯示本地和遠程分支 $git branch xxxbranchName -------創建分支名xxxbranchName的分支,此時HEAD的引用仍然是指向原來的分支 $git branch -d xxxbranchName ---刪除某一個分支,如果該分支的修改沒有合并,那么刪除失敗 $git branch -D xxxbranchName -----強制刪除分支

2.git tag

使用tag命令可以管理標簽。標簽和分支的區別是,標簽是不可以修改的。如果要修改必須基于該標簽拉出一個分支修改

$git tag -------------展示所有的tag $git tag xxxtagName ---------------新建xxxtagName的標簽 $git tag -d xxxtagName ---------刪除xxxtagName的標簽

3.git checkout

checkout命令可以檢出某個提交或者分支。

$git checkout SHA-1 ----------檢出某個SHA-1對應的提交 $git checkout xxxbranchName -------------我們使用git branch xxxbranchName的時候只是新建了這個分支,需要執行該命令切換到該分支 $git checkout HEAD^ -----檢出到HEAD的第一個父提交 $git checkout -b xxxbranchName -------------新建xxxbranchName并檢出到該分支

當我們checkout除分支外的其他SHA-1都會提示我們處于detached HEAD狀態,此時.git/HEAD文件里面的內容就是SHA-1

此時如果在分離頭上做的修改和提交想合并到其他分支需要用到merge和rebase等命令

四、合并命令

1.git merge

merge命令可以合并兩個多個提交,并生成一個新的提交。當前分支始終是目標分支。
假設歷史記錄如下,且當前分支為master:

A---B---C topic/D---E---F---G master

然后運行 "git merge topic",將會產生一個新的提交H,其中H的父提交是C和G。

A---B---C topic/ \D---E---F---G---H master $ git merge fixes enhancements 可以合并多個分支到當前分支 $git merge 8b9612d76178416c06da3b76cfab2945ddc98347 ----合并某個提交

合并中沖突的處理:

$ git merge feture1 Auto-merging gameoflife-deploy/pom.xml CONFLICT (content): Merge conflict in gameoflife-deploy/pom.xml Automatic merge failed; fix conflicts and then commit the result.

merge命令可以一次性把所有沖突的文件合并,然后提示用戶合并沖突去解決。解決完沖突以后,需要運行git add命令把文件添加到暫存區。繼續執行git merge --continue命令編輯新生成的提交的log信息。然后merge完成。

2.git rebase

rebase命令除了可以更改提交以外,同時可以合并代碼,不過和merge命令有些不同。
假設歷史記錄如下,且當前分支為topic:

A---B---C topic/D---E---F---G master

那么運行git rebase master的時候,其提交如下:

A'--B'--C' topic/D---E---F---G master

其中A'、B'、C'和A、B、C已經不是同一個提交(其tree對象不是同一個,父提交也不是同一個),但是其修改的內容是相同的。
rebase命令合并的時候從兩個分支(或者提交)公共的父提交開始變基。
總體變基命令用的不多,而且場景比較復雜(可以查看其help文檔)。慎用

3.merge和rebase的區別

1、merge命令會產生一個合并提交,而變基不會。變基命令的提交樹會比較清晰,merge存在各種合并,看著比較混亂。
2、工作流不同,對于merge命令其合并是所有提交一次合并好,然后解決沖突,而變基命令只能一個提交一個提交的解決沖突。

merge:merge的時候把待合并的所有commit一次合并好,只顯示一次沖突,解決完沖突以后運行一次git merge --continue就行。 rebase: 工作流程大概如下:commit =nextNeedMergeCommit()while(merge(commit)==confict){resoveConfilec();rebaseContinue();commit =nextNeedMergeCommit()}

4.Fast-forward快進式合并

在合并的時候經常會遇到快進式合并,那么什么是快進式合并么?
假設存在如下的場景:

A---B---C topic/D---E master 那么我們執行git merge topic命令的時候,其結果就是快進式合并如下: D---E --- A---B---C master

而如果執行git merge topic --no-ff 非快進式提交,測試如下的結果如下:

A---B---C/ \ D---E --------------M master

會多產生一個提交M,其父提交為E和C。

5.git cherry-pick

可以使用cherry-pick摘取每個提交的內容,并合并當前分支
假設歷史記錄如下,且當前分支為topic:

A---B---C topic/D---E---F---G master

假設我們指向合并A、B到master分支,那么就可以使用cherry-pick命令

$git cherry-pick topic~2 topic~1A---B---C topic/D---E---F---G-----A'---B' master

如果出現合并沖突,同樣需要處理沖突,然后使用git cherry-pick --continue命令繼續

6.git如何追蹤沖突

當出現沖突的時候:

  • .git/MERGE_HEAD 記錄合并進來的提交的SHA1值。
  • .git/MERGE_MSG包含當解決沖突以后執行git commit后默認的消息日志
  • git的索引(暫存區)里面每個沖突文件的三個副本:合并基礎、“我們的”版本和“他們的版本”。給這三個副本分配了各自的編號1、2、3.
  • 沖突的版本(合并標記和所有內容)不存儲在暫存區內。

可以使用git ls-files -u命令查看沖突的文件。

轉載于:https://blog.51cto.com/5162886/2087794

總結

以上是生活随笔為你收集整理的git命令行(2)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。