天天看點

常用的git必須知道的小技巧(持續更新)一、避免沖突二、單獨将某個分支的某個送出放到另外一個分支 cherry-pick三、pull --rebase手動解決沖突四、建立/删除本地分支及遠端分支五、tortoise push不用每次輸入賬号密碼3、tortoise配置

目錄

一、避免沖突

二、單獨将某個分支的某個送出放到另外一個分支 cherry-pick

三、pull --rebase手動解決沖突

四、建立/删除本地分支及遠端分支

五、tortoise push不用每次輸入賬号密碼

1 Git生成秘鑰

1.1 确認本地秘鑰

1.2 生成秘鑰資訊

2 gitlab秘鑰添加

2.1登入gitlab

2.2 添加秘鑰

         3 tortoise配置

一、避免沖突

1、本地有修改 沒commit之前不要pull

2、想要送出先stash 再pull 再 commit 再push

3、在本地解決

操作:

git stash

git pull --rebase

git stash pop

git push

這樣如果有沖突可以現在本地解決

二、單獨将某個分支的某個送出放到另外一個分支 cherry-pick

概述   git cherry-pick可以了解為”挑揀”送出,它會擷取某一個分支的單筆送出,并作為一個新的送出引入到你目前分支上。 當我們需要在本地合入其他分支的送出時,如果我們不想對整個分支進行合并,而是隻想将某一次送出合入到本地目前分支上,那麼就要使用git cherry-pick了。 用法   git cherry-pick [<options>] <commit-ish>... 常用options:     --quit                退出目前的chery-pick序列     --continue            繼續目前的chery-pick序列     --abort               取消目前的chery-pick序列,恢複目前分支     -n, --no-commit       不自動送出     -e, --edit            編輯送出資訊         git cherry-pick commitid   在本地倉庫中,有兩個分支:branch1和branch2,我們先來檢視各個分支的送出:   # 切換到branch2分支 $ git checkout branch2 Switched to branch 'branch2' $ $ # 檢視最近三次送出 $ git log --oneline -3 23d9422 [Description]:branch2 commit 3 2555c6e [Description]:branch2 commit 2 b82ba0f [Description]:branch2 commit 1   # 切換到branch1分支 $ git checkout branch1 Switched to branch 'branch1'   # 檢視最近三次送出 $ git log --oneline -3 20fe2f9 commit second c51adbe commit first ae2bd14 commit 3th             現在,我想要将branch2分支上的第一次送出内容合入到branch1分支上,則可以使用git cherry-pick指令:   $ git cherry-pick 2555c6e error: could not apply 2555c6e... [Description]:branch2 commit 2 hint: after resolving the conflicts, mark the corrected paths hint: with 'git add <paths>' or 'git rm <paths>' hint: and commit the result with 'git commit'       當cherry-pick時,沒有成功自動送出,這說明存在沖突,是以首先需要解決沖突,解決沖突後需要git commit手動進行送出:   $ git commit [branch1 790f431] [Description]:branch2 commit 2 Date: Fri Jul 13 18:36:44 2018 +0800 1 file changed, 1 insertion(+) create mode 100644 only-for-branch2.txt       或者git add .後直接使用git cherry-pick --continue繼續。 現在檢視送出資訊:   $ git log --oneline -3 790f431 [Description]:branch2 commit 2 20fe2f9 commit second c51adbe commit first   branch2分支上的第二次送出成功合入到了branch1分支上。   以上就是git cherry-pick的基本用法,如果沒有出現沖突,該指令将自動送出。 git cherry-pick -n   如果不想git cherry-pick自動進行送出,則加參數-n即可。比如将branch2分支上的第三次送出内容合入到branch1分支上:   $ git cherry-pick 23d9422 [branch1 2c67715] [Description]:branch2 commit 3 Date: Fri Jul 13 18:37:05 2018 +0800 1 file changed, 1 insertion(+) $   檢視送出log,它自動合入了branch1分支:   $ git log --oneline -3 2c67715 [Description]:branch2 commit 3 f8bc5db [Description]:branch2 commit 2 20fe2f9 commit second         如果不想進行自動合入,則使用git cherry-pick -n:   # 回退上次送出,再此進行cherry-pick $ git reset --hard HEAD~ HEAD is now at f8bc5db [Description]:branch2 commit 2 $ git cherry-pick -n 23d9422 $ git status On branch branch1 Changes to be committed:   (use "git reset HEAD <file>..." to unstage)     modified:   only-for-branch2.txt $     這時通過git status檢視,發現已将branch2的送出擷取但是沒有合入。 git cherry-pick -e   如果想要在cherr-pick後重新編輯送出資訊,則使用git cherry-pick -e指令,比如我們還是要将branch2分支上的第三次送出内容合入到branch1分支上,但是需要修改送出資訊:   $ git cherry-pick -e 23d9422     1 [Description]:branch2 commit 3   2 #   3 # It looks like you may be committing a cherry-pick.   4 # If this is not correct, please remove the file   5 #       .git/CHERRY_PICK_HEAD   6 # and try again.       git cherry-pick –continue, –abort,–quit   當使用git cherry-pick發生沖突後,将會出現如下資訊:   $ git cherry-pick 23d9422 error: could not apply 23d9422... [Description]:branch2 commit 3 hint: after resolving the conflicts, mark the corrected paths hint: with 'git add <paths>' or 'git rm <paths>' hint: and commit the result with 'git commit'       這時如果要繼續cherry-pick,則首先需要解決沖突,通過git add .将檔案标記為已解決,然後可以使用git cherry-pick --continue指令,繼續進行cherry-pick操作。   如果要中斷這次cherry-pick,則使用git cherry-pick --quit,這種情況下目前分支中未沖突的内容狀态将為modified,   如果要取消這次cherry-pick,則使用git cherry-pick --abort,這種情況下目前分支恢複到cherry-pick前的狀态,沒有改變。 git cherry-pick < branchname >   如果在git cherry-pick後加一個分支名,則表示将該分支頂端送出進cherry-pick,如:   $ git cherry-pick master     git cherry-pick ..< branchname > git cherry-pick ^HEAD < branchname >       以上兩個指令作用相同,表示應用所有送出引入的更改,這些送出是branchname的祖先但不是HEAD的祖先,比如,現在我的倉庫中有三個分支,其送出曆史如下圖:                  C<---D<---E  branch2               / master   A<---B                 \                F<---G<---H  branch3                          |                          HEAD       如果我使用git cherry-pick ..branch2或者git cherry-pick ^HEAD branch2,那麼會将屬于branch2的祖先但不屬于branch3的祖先的所有送出引入到目前分支branch3上,并生成新的送出,執行指令如下:   $ git cherry-pick ..branch2 [branch3 c95d8b0] [Description]:branch2  add only-for-branch2 Date: Fri Jul 13 20:34:40 2018 +0800 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 only-for-branch2 [branch3 7199a67] [Description]:branch2 modify for only-for-branch2--1 Date: Fri Jul 13 20:38:35 2018 +0800 1 file changed, 1 insertion(+) [branch3 eb8ab62] [Description]:branch2 modify for only-for-branch2--2 Date: Fri Jul 13 20:39:09 2018 +0800 1 file changed, 1 insertion(+)       執行後的送出曆史如下:                    C<---D<---E  branch2               / master   A<---B                 \                F<---G<---H<---C'<---D'<---E'  branch3                                           |                                          HEAD     常見問題 1.The previous cherry-pick is now empty, possibly due to conflict resolution. 原因:   在cherry-pick時出現沖突,解決沖突後本地分支中内容和cherry-pick之前相比沒有改變,是以當在以後的步驟中繼續git cherry-pick或執行其他指令時,由于此時還處于上次cherry-pick,都會提示該資訊,表示可能是由于解決沖突造成上一次cherry-pick内容是空的。 解決方案:       1.執行git cherry-pick --abort取消上次操作。       2.執行git commit --allow-empty,表示允許空送出。   2.fatal: You are in the middle of a cherry-pick – cannot amend. 原因:   在cherry-pick時出現沖突,沒有解決沖突就執行git commit --amend指令,進而會提示該資訊。 解決方案:   首先在git commit --amend之前解決沖突,并完成這次cherry-pick:   $ git add . $ git cherry-pick --continue      

三、pull --rebase手動解決沖突

git pull --rebase 沖突手動解決 1、git pull --rebase 要求解決沖突       打開檔案處理沖突(二選一,儲存 2、進入了rebase分支

常用的git必須知道的小技巧(持續更新)一、避免沖突二、單獨将某個分支的某個送出放到另外一個分支 cherry-pick三、pull --rebase手動解決沖突四、建立/删除本地分支及遠端分支五、tortoise push不用每次輸入賬号密碼3、tortoise配置

     3、git add xx. jsp  // 标記剛才有沖突的檔案夾,修改過的檔案     // 不想應用修改就使用 git rm xx.jsp

常用的git必須知道的小技巧(持續更新)一、避免沖突二、單獨将某個分支的某個送出放到另外一個分支 cherry-pick三、pull --rebase手動解決沖突四、建立/删除本地分支及遠端分支五、tortoise push不用每次輸入賬号密碼3、tortoise配置
常用的git必須知道的小技巧(持續更新)一、避免沖突二、單獨将某個分支的某個送出放到另外一個分支 cherry-pick三、pull --rebase手動解決沖突四、建立/删除本地分支及遠端分支五、tortoise push不用每次輸入賬号密碼3、tortoise配置

  4、git rebase --continue  退出rebase分支   5、git commit -m '····' // 送出本次修改   6、git push   7、 如果使用git rebase --skip 會放棄這次commit的所有修改且在git log找不回 可以使用git relog 找回commit   找回git rebase --skip消失的代碼 1.git reflog操作,檢視送出的曆史記錄,找到自己的送出 2.強制回退到上一次送出:git reset --hard  791a1fc 或者 git reset --hard  HEAD@{2}   (HEAD@{2}   git reflog顯示在分支前面的 數字表示往前退幾個) 3.再一次rebase,如果有沖突,就解決沖突, 4.進行git add -A 以及git rebase --continue

四、建立/删除本地分支及遠端分支

建立本地和遠端分支 (git branch -a 可檢視項目所有的本地和遠端分支   1、先切換到要拉基礎代碼的分支 git checkout dev   2、把基礎代碼pull下來保證一緻 git pull    3、切換并建立本地新分支 git checkout -b newBranchName   4、建立遠端上遊分支 git push 再按照提示複制一串代碼 或者直接 git push --set-upstream origin  newBranchName (git push origin newBranchName 似乎也是可以的不過上面可能更嚴謹吧   删除本地和遠端分支   1、 先切換到一個安全的分支 git checkout dev   1、 删除本地分支  git branch -d 分支名   2、 删除遠端分支 git push origin –delete 分支名    

五、tortoise push不用每次輸入賬号密碼

1 Git生成秘鑰

1.1 确認本地秘鑰

SSH 秘鑰預設儲存在賬戶的主目錄下的 ~/.ssh 目錄

如:C:\Users\BF100400\.ssh\

檢視是否包含id_rsa和id_rsa.pub(或者是id_dsa和id_dsa.pub之類成對的檔案),有.pub 字尾的檔案就是公鑰,另一個檔案則是密鑰。

如果有這兩個檔案,則跳過1.2;如果沒有這兩個檔案,甚至.ssh目錄也沒有,則需要用ssh-keygen 來建立

1.2 生成秘鑰資訊

  • 在.ssh 目錄下右鍵打開Git Bash(.ssh目錄不存在,則在任一目錄下操作,或者手動建立該目錄)
常用的git必須知道的小技巧(持續更新)一、避免沖突二、單獨将某個分支的某個送出放到另外一個分支 cherry-pick三、pull --rebase手動解決沖突四、建立/删除本地分支及遠端分支五、tortoise push不用每次輸入賬号密碼3、tortoise配置
  • 生成秘鑰:ssh-keygen -t rsa -C "[email protected]" ,直接Enter就行,然後會提示輸入密碼(可輸可不輸)

     說明:指令中的email,就是gitlab中的賬号,需要保持一緻

常用的git必須知道的小技巧(持續更新)一、避免沖突二、單獨将某個分支的某個送出放到另外一個分支 cherry-pick三、pull --rebase手動解決沖突四、建立/删除本地分支及遠端分支五、tortoise push不用每次輸入賬号密碼3、tortoise配置
  • 執行完成之後,在.ssh 目錄下就會生成秘鑰檔案(沒有.ssh目錄的會自動生成,手動建立的則不會重複生成)
常用的git必須知道的小技巧(持續更新)一、避免沖突二、單獨将某個分支的某個送出放到另外一個分支 cherry-pick三、pull --rebase手動解決沖突四、建立/删除本地分支及遠端分支五、tortoise push不用每次輸入賬号密碼3、tortoise配置

2 gitlab秘鑰添加

筆者目前所在公司使用的gitlab作為代碼管理倉庫平台,是以下面是gitlab為例說明如何進行秘鑰添加,如果個人研究或學習使用的是github,方法同下

2.1登入gitlab

使用申請的gitlab賬号登入

確定登入成功

2.2 添加秘鑰

  • 在搜尋框中搜尋:SSH Keys
常用的git必須知道的小技巧(持續更新)一、避免沖突二、單獨将某個分支的某個送出放到另外一個分支 cherry-pick三、pull --rebase手動解決沖突四、建立/删除本地分支及遠端分支五、tortoise push不用每次輸入賬号密碼3、tortoise配置
  • 點選 Add SSH Keys
常用的git必須知道的小技巧(持續更新)一、避免沖突二、單獨将某個分支的某個送出放到另外一個分支 cherry-pick三、pull --rebase手動解決沖突四、建立/删除本地分支及遠端分支五、tortoise push不用每次輸入賬号密碼3、tortoise配置
  • 拷貝公鑰檔案(即1.2中生成的id_rsa.pub)中的資訊到key輸入框中,title可以随便起,見名知意即可。然後點選Add Keys
常用的git必須知道的小技巧(持續更新)一、避免沖突二、單獨将某個分支的某個送出放到另外一個分支 cherry-pick三、pull --rebase手動解決沖突四、建立/删除本地分支及遠端分支五、tortoise push不用每次輸入賬号密碼3、tortoise配置

至此,git及gitlab相關配置已經全部完成,接下來可以使用git從gitlab上克隆代碼來測試相關安裝和配置的正确性

3、tortoise配置

常用的git必須知道的小技巧(持續更新)一、避免沖突二、單獨将某個分支的某個送出放到另外一個分支 cherry-pick三、pull --rebase手動解決沖突四、建立/删除本地分支及遠端分支五、tortoise push不用每次輸入賬号密碼3、tortoise配置

  加入存好的私鑰