簡體   English   中英

Git:從主分支移動更改

[英]Git: move changes off of master branch

基本問題,但這一直發生在我身上:

  • working-branch更改
  • 切換到master
  • git merge working-branch
  • git push
  • cap deploy (到staging)
  • 泡一杯新茶

然后我回過頭來想想別的東西,然后開始做一些改變......同時還要掌握。

什么是簡單的方法:

  1. 防止對master進行直接編輯(也許警告)
  2. 將所有編輯移動到working-branch和清除master以便我可以繼續編輯working-branch
  3. 將編輯旋轉到一個全新的分支new-working-branch ,然后丟棄working-branch

本頁 “分支”部分的后半部分冒了一個風險並嘗試了推薦,但這只是消除了我的所有編輯!?! 也許是因為在git branch dubious-experimentgit 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 mastergit 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM