[英]Git: move changes off of master branch
基本問題,但這一直發生在我身上:
working-branch
更改 master
git merge working-branch
git push
cap deploy
(到staging) 然后我回過頭來想想別的東西,然后開始做一些改變......同時還要掌握。
什么是簡單的方法:
working-branch
和清除master
以便我可以繼續編輯working-branch
new-working-branch
,然后丟棄working-branch
? 在本頁 “分支”部分的后半部分冒了一個風險並嘗試了推薦,但這只是消除了我的所有編輯!?! 也許是因為在git branch dubious-experiment
和git checkout master
,兩個分支上的git status
是相同的(在master上不是'clean')。 所以git reset --hard <SHA1sum>
消滅了兩者的所有變化!?!
git branch dubious-experiment
M---N-----O----P---Q ("master" and "dubious-experiment")
git checkout master
# Be careful with this next command: make sure "git status" is
# clean, you're definitely on "master" and the
# "dubious-experiment" branch has the commits you were working
# on first...
git reset --hard <SHA1sum of commit N>
根據您的描述,我假設您尚未提交任何更改 - 這是正確的嗎?
如果是的話,這是你的答案:
您需要在編輯器中設置它,但這可能很難。 在提示符和編輯器中顯示當前分支有很大幫助。
new-working-branch
,然后丟棄working-branch
git checkout -b new-working-branch
git add …
git commit -m "mycommit"
由於你還沒有提交任何東西,你不需要在master上做任何改變。 如果您願意,現在可以丟棄您的工作分支。
working-branch
git checkout -b temp-branch
git add …
git commit -m "mycommit"
git rebase --onto working-branch master
git checkout working-branch
git reset --hard temp-branch
git branch -d temp-branch
如果您的更改不與master上的任何更改沖突,但不會與工作分支中的更改沖突,則可以更簡單地完成此操作:
git stash
git checkout working-branch
git stash pop
如果您已將更改提交給master
但沒有推送到任何地方......
為最后的更改創建一個新分支
git checkout -b newfeat master
在working-branch
分支上重放所有更改(移動提交)
git rebase --onto working-branch origin/master newfeat
更改master
分支並將其重置為上次推送的狀態
git checkout master
git reset --hard origin/master
此時你有:
master
指向最后被推提交( origin/master
) working-branch
從未改變過 newfeat
分支,包含所有新的提交,並且領先於working-branch
。 我用過類似的情況:
git branch -f <branch-name>
git checkout <branch-name>
要么
git checkout -B <branch-name>
。
兩種變體都將分支branch-name
移動到您當前的提交,而不需要重新設置樹。
我通常建議使用以下Git設置:
git config push.default nothing
有了這個,你至少必須在推動時命名分支。 它不會阻止你在本地提交master,但是當你意識到你擁有時,你可以將這些提交移動到一個分支而不會影響其他任何人。
在你真正執行一個可以修改某些東西的git命令之前,養成輸入$ git status
的習慣。
鑒於此,您可能已經編輯了文件但未將其簽入,因為您將在提交之前運行git status
。 在這種情況下,如果你只是切換分支然后提交,git會做正確的事情。
如果你已經向master發送了一個提交,那么只需在分支之間移動文件,如下所示:
$ git checkout --patch master <somefile>
如果你只是想用它合並同一個文件,你真的不需要重置master,但是因為你可能還沒有推送任何東西,你應該重置到遠程跟蹤分支......
$ git reset master origin/master
$ git reset stage origin/stage # whatever
1.阻止對主人的直接編輯(也許警告)
你並不是唯一一個想要這個的人。 我遇到的最好的想法是將git分支直接放在shell提示符中。 我的提示如下:
[user@host directory:git_branch]
我也為git_branch條目着色,所以我在任何時候都在努力。 Stack Overflow上的這 兩個鏈接應該有助於您的提示。
2.將所有編輯移動到工作分支和清除主控,以便我可以繼續編輯工作分支
要么
3.將編輯旋轉到一個全新的分支新工作分支,然后丟棄工作分支?
這些都是同樣的問題 - 如何將主變更移到分支上,無論是舊分支還是新分支。 而你自己的答案是正確的。 雖然乍一看,假設你是主人,你可以更簡單地運行:
git branch new_branch
git reset --hard origin/master
我更喜歡將master重置為origin / master而不是擔心特定的提交SHA。 但你的步驟基本上是正確的。 至於為什么你丟失了更改,我必須認為在重置master時錯誤地沒有指向Q的分支指針。 沒有其他解釋是有道理的。 再次,擁有分支shell提示符將有助於避免這些錯誤。 此外,我很喜歡使用gitk或git log --graph來驗證我的分支在我移動它們之前的位置。 由於我無法在工作中輕松使用gitk,因此我的.gitconfig中有一個名為“graph”的別名,它本質上是它的命令行版本:
[alias]
graph = log --graph --all --date=short --pretty=format':%C(yellow)%h%Cblue%d%Creset %s %Cgreen %aN, %ad%Creset'
這將顯示最左側的圖形,黃色的提交SHA,藍色的分支,白色的提交消息和綠色的作者和日期。 當然,這可以根據自己的喜好進行修改。
[編輯使上述命令更簡單]
==============================
回應以下評論:
從...開始
A-B < origin/master
\
C-D < master
現在執行git checkout -b new_branch
A-B < origin/master
\
C-D < master, new_branch
現在checkout master, git checkout master
。 請注意,如果您已經在master上,那么git checkout -b new_branch && git checkout master
與git branch new_branch
相同。 我編輯了上面的答案以反映這一點。
現在將master重置為origin / master, git reset --hard origin/master
A-B < master, origin/master
\
C-D < new_branch
因為你有一個指向D的分支(new_branch),所以不會丟失任何更改。 如果我犯了錯誤,請詳細說明。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.