我有两个分支,email和staging.staging是最新的,我不再需要email分支中的旧更改,但我不想删除它们.
所以,我只是想的所有内容转储staging到email让他们都指向同一个commit.那可能吗?
kni*_*ttl 185
您可以使用"我们的"合并策略:
$ git checkout staging
$ git merge -s ours email # Merge branches, but use our branch head
Run Code Online (Sandbox Code Playgroud)
Syl*_*sne 91
如果您只想让两个分支"电子邮件"和"暂存"相同,您可以标记"电子邮件"分支,然后将"电子邮件"分支重置为"分段"分支:
$ git checkout email
$ git tag old-email-branch
$ git reset --hard staging
Run Code Online (Sandbox Code Playgroud)
您还可以在'email'分支上重新定位'staging'分支.但结果将包含两个分支的修改.
Shy*_*ada 66
其他答案给了我正确的线索,但他们没有完全帮助.
$ git checkout email
$ git tag old-email-branch # This is optional
$ git reset --hard staging
$
$ # Using a custom commit message for the merge below
$ git merge -m 'Merge -s our where _ours_ is the branch staging' -s ours origin/email
$ git push origin email
Run Code Online (Sandbox Code Playgroud)
如果没有与我们的策略合并的第四步,推送被认为是非快进更新,将被拒绝(由GitHub).
Bru*_*olo 65
我已经看到了几个答案,这是唯一让我在没有任何冲突的情况下解决问题的程序.
如果你想在branch_old中的branch_new进行所有更改,那么:
git checkout branch_new
git merge -s ours branch_old
git checkout branch_old
git merge branch_new
Run Code Online (Sandbox Code Playgroud)
一旦应用了这四个命令,您就可以毫无问题地推送branch_old
jsa*_*rma 40
如果你像我一样并且你不想处理合并,你可以执行上述步骤,除了使用force而不是merge,因为它会创建一个令人分心的日志文件路径:
git checkout email
git reset --hard staging
git push origin email --force
Run Code Online (Sandbox Code Playgroud)
注意:仅当您真的不想再次看到电子邮件中的内容时.
小智 21
警告:这会删除电子邮件分支上的所有提交。这就像删除电子邮件分支并在暂存分支的头部重新创建它。
最简单的方法:
//the branch you want to overwrite
git checkout email
//reset to the new branch
git reset --hard origin/staging
// push to remote
git push -f
Run Code Online (Sandbox Code Playgroud)
现在电子邮件分支和暂存是相同的。
Mad*_*dhu 16
我想合并两个分支,以便old_branch使用来自的内容更新所有内容new_branch
对我来说,这就像一个魅力:
$ git checkout new_branch
$ git merge -m 'merge message' -s ours origin/old_branch
$ git checkout old_branch
$ git merge new_branch
$ git push origin old_branch
Run Code Online (Sandbox Code Playgroud)
Are*_*k S 10
怎么样:
git branch -D email
git checkout staging
git checkout -b email
git push origin email --force-with-lease
Run Code Online (Sandbox Code Playgroud)
你想要的是这个(实际上与当前接受的答案完全相反):
git checkout email
git merge --strategy-option=theirs staging
Run Code Online (Sandbox Code Playgroud)
其作用是:
email分支文件现在将与分支完全相同stagingemail分支的历史记录将被保留staging分支的历史记录将被添加到email历史记录中作为附加值,如果您不需要staging分支的所有历史记录,您可以将squash其汇总为单个提交消息。
git checkout email
git merge --squash --strategy-option=theirs staging
git commit -m "Single commit message for squash branch's history here'
Run Code Online (Sandbox Code Playgroud)
总而言之,第二个版本的作用是:
email分支文件现在将与分支完全相同stagingemail分支的历史记录将被保留email单个提交将添加到分支历史记录的顶部。staging此提交将代表分支中发生的所有更改其他答案似乎不完整。
我已经在下面进行了充分的尝试,并且工作正常。
注意:
1.为安全起见,在尝试以下操作之前,请复制存储库的副本。
详细信息:
1.所有开发都在dev分支中进行
。2. qa分支与dev的副本相同
。3.不时需要将dev代码移入/覆盖到qa分支中。
所以我们需要覆盖dev分支中的qa分支
第1部分:
使用以下命令,旧的qa已更新为较新的dev:
git checkout dev
git merge -s ours qa
git checkout qa
git merge dev
git push
Run Code Online (Sandbox Code Playgroud)
最后推送的自动评论如下:
// Output:
// *<MYNAME> Merge branch 'qa' into dev,*
Run Code Online (Sandbox Code Playgroud)
此注释看起来是相反的,因为上面的序列也看起来是相反的
第2部分:
以下是开发人员中意外的,新的本地提交,不必要的提交,
因此,我们需要抛弃并使开发保持不变。
git checkout dev
// Output:
// Switched to branch 'dev'
// Your branch is ahead of 'origin/dev' by 15 commits.
// (use "git push" to publish your local commits)
git reset --hard origin/dev
// Now we threw away the unexpected commits
Run Code Online (Sandbox Code Playgroud)
第3部分:
验证一切均符合预期:
git status
// Output:
// *On branch dev
// Your branch is up-to-date with 'origin/dev'.
// nothing to commit, working tree clean*
Run Code Online (Sandbox Code Playgroud)
就这样。
1.现在旧的qa已被新的dev分支代码覆盖
。2. local是干净的(远程原点/ dev未被修改)
| 归档时间: |
|
| 查看次数: |
180652 次 |
| 最近记录: |