目錄
一、避免沖突
二、單獨将某個分支的某個送出放到另外一個分支 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分支
3、git add xx. jsp // 标記剛才有沖突的檔案夾,修改過的檔案 // 不想應用修改就使用 git rm xx.jsp
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目錄不存在,則在任一目錄下操作,或者手動建立該目錄)
- 生成秘鑰:ssh-keygen -t rsa -C "[email protected]" ,直接Enter就行,然後會提示輸入密碼(可輸可不輸)
說明:指令中的email,就是gitlab中的賬号,需要保持一緻
- 執行完成之後,在.ssh 目錄下就會生成秘鑰檔案(沒有.ssh目錄的會自動生成,手動建立的則不會重複生成)
2 gitlab秘鑰添加
筆者目前所在公司使用的gitlab作為代碼管理倉庫平台,是以下面是gitlab為例說明如何進行秘鑰添加,如果個人研究或學習使用的是github,方法同下
2.1登入gitlab
使用申請的gitlab賬号登入
確定登入成功
2.2 添加秘鑰
- 在搜尋框中搜尋:SSH Keys
- 點選 Add SSH Keys
- 拷貝公鑰檔案(即1.2中生成的id_rsa.pub)中的資訊到key輸入框中,title可以随便起,見名知意即可。然後點選Add Keys
至此,git及gitlab相關配置已經全部完成,接下來可以使用git從gitlab上克隆代碼來測試相關安裝和配置的正确性
3、tortoise配置
加入存好的私鑰