我如何将我最近的承诺转移到一个新的分支机构,并在这些承诺完成之前重新定义主? 例如:
master A - B - C - D - E
为此:
newbranch C - D - E
/
master A - B
我如何将我最近的承诺转移到一个新的分支机构,并在这些承诺完成之前重新定义主? 例如:
master A - B - C - D - E
为此:
newbranch C - D - E
/
master A - B
当前回答
在一般...
由 sykora 曝光的方法是最好的选择,但有时不是最简单的方法,而且不是一般的方法。
为了实现OP想要的,它的2步过程:
步骤1 - 注意你想要的新行业的主人的承诺
执行
git checkout master
git log
在这里我将使用: C 承诺: 9aa1233 D 承诺: 453ac3d E 承诺: 612ecb3
注意:您可以使用前七个字符或整个承诺字符。
步骤2 - 把它们放在新行业
git checkout newbranch
git cherry-pick 612ecb3
git cherry-pick 453ac3d
git cherry-pick 9aa1233
或(在 Git 1.7.2 + 上,使用范围)
git checkout newbranch
git cherry-pick 612ecb3~1..9aa1233
git cherry-pick 适用于新行业的这三个承诺。
其他回答
如果你想将你的承诺转移到一个现有分支,它会看起来如下:
git checkout existingbranch
git merge branchToMoveCommitFrom
git checkout branchToMoveCommitFrom
git reset --hard HEAD~3 # Go back 3 commits. You *will* lose uncommitted work.
git checkout existingbranch
警告: 这个方法工作,因为你正在创建一个新的分支与第一个命令: git 分支新分支. 如果你想将承诺转移到一个现有分支,你需要将你的变化融入现有分支之前执行 git 重新设置 --hard HEAD~3 (见移动到一个现有分支上)。
除非有其他情况涉及,否则可以轻松地通过连接和旋转。
# Note: Any changes not committed will be lost.
git branch newbranch # Create a new branch, saving the desired commits
git checkout master # checkout master, this is the place you want to go back
git reset --hard HEAD~3 # Move master back by 3 commits (Make sure you know how many commits you need to go back)
git checkout newbranch # Go to the new branch that still has the desired commits
git reset --hard a1b2c3d4
最后,您可能需要强迫将最新的更改推到主重复:
git push origin master --force
警告: 使用 Git 版本 2.0 及以后,如果您稍后 git 将新分支转移到原始(主)分支上,您可能需要在转移期间明确的 --no-fork-point 选项,以避免失去所承担的承诺。
1) 创建一个新的分支,将所有更改转移到 new_branch。
git checkout -b new_branch
(二)然后回到旧的分支。
git checkout master
3、做吉·雷巴斯
git rebase -i <short-hash-of-B-commit>
4) 然后打开的编辑器包含最后3个承诺信息。
...
pick <C's hash> C
pick <D's hash> D
pick <E's hash> E
...
5) 更改选项下载所有这些 3 任务. 然后保存并关闭编辑器。
...
drop <C's hash> C
drop <D's hash> D
drop <E's hash> E
...
6) 现在最后3个命令从当前分支(主)中移除。 现在强烈推分支,在分支名称之前 + 标志。
git push origin +master
我不得不将7个承诺从一个旧行业转移到一个新行业。
git checkout old-branch # in the example, master
git reset --hard h4sh # h4sh is the hash for the commit
git checkout -b new-branch
git push origin new-branch
在 git checkout new-branch 之后,我得到了好 git log 和 git 状态,但是,当我访问旧行(git checkout old-branch)时,我得到了“git 落后于 7 行,可以快速推进”。
git checkout old-branch
git status
> git is behind by 7 commits and can be fast-forwarded
git push origin old-branch -f
在这一步之后,最后7个承诺仅适用于新分支,而以前的承诺则适用于Bitbucket树的旧分支和新分支。
这不是在技术上“移动”它们,但它有相同的效果:
A--B--C (branch-foo)
\ ^-- I wanted them here!
\
D--E--F--G (branch-bar)
^--^--^-- Opps wrong branch!
While on branch-bar:
$ git reset --hard D # remember the SHAs for E, F, G (or E and G for a range)
A--B--C (branch-foo)
\
\
D-(E--F--G) detached
^-- (branch-bar)
Switch to branch-foo
$ git cherry-pick E..G
A--B--C--E'--F'--G' (branch-foo)
\ E--F--G detached (This can be ignored)
\ /
D--H--I (branch-bar)
Now you won't need to worry about the detached branch because it is basically
like they are in the trash can waiting for the day it gets garbage collected.
Eventually some time in the far future it will look like:
A--B--C--E'--F'--G'--L--M--N--... (branch-foo)
\
\
D--H--I--J--K--.... (branch-bar)
對於那些想知道為什麼它工作(正如我開始的那樣):
你想回到C,然后移动D和E到新分支。
A-B-C-D-E (HEAD)
↑
master
在Git分支新Branch之后:
newBranch
↓
A-B-C-D-E (HEAD)
↑
master
此分類上一篇: git reset --hard HEAD~2:
newBranch
↓
A-B-C-D-E (HEAD)
↑
master
因为一个分支只是一个指标,大师指向最后一个承诺。当你做了新的Branch,你只是做一个新的指标到最后一个承诺. 然后使用Git重新设置你移动了大师指标回两个承诺. 但因为你没有移动新的Branch,它仍然指向承诺它最初做了。