我正在開發一個功能分支,比方說
git checkout -b "Cool_Feature_1"。我創建了 4 個帶有原子更改的提交,因為檢查它們更容易并且它們都分組,例如“移動檔案結構”或“洗掉一些重復的代碼”。
假設在 4 次提交中的 1 次中我移動了一個檔案。
作業完成后,我推送了所有更改并創建了一個合并請求。審稿人告訴我在commit 1中更改檔案路徑,其他看起來不錯。
我怎么做?
我的方法:
git log找出必要的提交
然后 git checkout 7c802ef576fbad061c6fefb350fde386e7d09087
再次進行我的更改
git add .
git commit --amend
但是現在,如果我這樣做,git push我會收到:
git push
? 10137 18:59:06
fatal: invalid refspec '(HEAD detached from 7c802ef57)'
最后,我想做
git push -f origin Cool_Feature_1并且只在 1 次提交中覆寫那個小的更改。基本上,我想從已經存在的合并請求中更改 1 個提交。
這里的人建議創建一個新分支,但這對我來說不是一個選擇。
uj5u.com熱心網友回復:
如果您的編輯很容易進行,并且您想重新開始,您可以這樣做:
git checkout Cool_Feature_1
git reset --hard origin/Cool_Feature_1
現在你有一個本地分支,就像 gitlab 上的分支一樣
git rebase -i HEAD^^^^^
將開始一個互動式變基
您將獲得最近提交的串列。如果您沒有將編輯器的默認值設定為其他內容,它將是vim,如果您不知道如何使用,則很難使用。
然后每次提交pick之前都會有一個。更改pick到e了承諾要編輯。然后保存檔案并退出編輯器。然后它會在您提交后立即停止。你可以像你說的那樣修改它......然后輸入git rebase --continue。should除了一次提交更改之外,您擁有的東西就像原始內容一樣。為了確保,請這樣做:
git diff origin/Cool_Feature_1
另外,我喜歡使用 gitk
gitk Cool_Feature_1 origin/Cool_Feature_1
將并排顯示兩個歷史以及它們的不同之處。
然后,如果您對分支的本地版本感到滿意,請像您在問題中所做的那樣將其強制推送到原點。
或者做你所做的:
git checkout 7c802ef576fbad061c6fefb350fde386e7d09087
但現在你處于“精神錯亂”的狀態——但這沒關系。
做出你的改變
那么你需要獲得在你簽出之后的所有提交。您可以從原始分支中挑選每一個:
git cherry-pick origin/Cool_Feature_1^^
git cherry-pick origin/Cool_Feature_1^
git cherry-pick origin/Cool_Feature_1
^意思是前一個。所以我上面放的是最后 3 次提交。如果您正在編輯第四個,那么請這樣做。如果您正在編輯倒數第三個,那么只需:
git cherry-pick origin/Cool_Feature_1^
git cherry-pick origin/Cool_Feature_1
然后看看你是否像這樣做對了:
git diff origin/Cool_Feature_1
另外,我喜歡使用 gitk
gitk HEAD origin/Cool_Feature_1
HEAD由于您檢出該提交的方式,這次才呼叫本地分支。
其實,像這樣打開gitk,并在整個程序中保持打開狀態并在每一步之后查看它真的很有幫助。
如果您對本地分支與遠程分支相同而感到高興,除了提交更改外,請強制推送它。
由于在這種情況下您沒有本地分支,請執行以下操作:
git push origin HEAD:Cool_Feature_1 -f
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/341230.html
上一篇:使用gitreset--hard"commitid",現在我的HEAD分離了
下一篇:如何簽出遠程分叉分支?
