gpt4 book ai didi

Git Rebasing onto generated files(通过删除自动解决删除/更改冲突)

转载 作者:太空狗 更新时间:2023-10-29 13:47:17 25 4
gpt4 key购买 nike

我在一家公司工作,其中一个团队在每次提交时不断包含生成的可执行文件(和一堆其他垃圾)。由于非技术原因,我不得不不断地在他们的基础上重新调整我们的工作。

这就是我大部分时间的样子:

   -----C------TNC--(their_branch)
\
\----CC--(master)

TNC(他们的新提交)包含:

  • 一些有用的改变
  • 很多垃圾

CC(清理提交)包含:

  • 添加.gitignore
  • rm a-lot-of-garbage-*

现在,我想做的是:

 (on master)$ git rebase their_branch

这当然会引发冲突(更改、删除)。因为这几乎是每天的任务,所以我想不慌不忙地去做(只要这每次都重新定义我们的整个历史就足够了)。所以我尝试了:

 (on master)$ git rebase their_branch -s recursive -X ours

根据Git manual ,这应该强制“通过支持我们的版本来干净地自动解决冲突的大块头。来自另一棵树的与我们这边不冲突的更改会反射(reflect)到 merge 结果中。对于二进制文件,整个内容都来 self 们这边”但它没有 - 它仍然停止并要求我解决冲突。我一直在运行一个删除文件的脚本,但这很烦人。

Git 可以强制删除二进制文件吗?

最佳答案

对于您的一组非常具体的情况,例如在您的分支上进行所有更改(包括文件删除),您可以按照以下几行进行。一般来说,最好始终手动解决 rebase。

# attempt a rebase, expect it to fail
$ git rebase their_branch

# take our side of all files that changed on their_branch and master branch,
# expect resolution to fail for renames (renames include file deletions) still;
# also note the meaning of `theirs` and ‘ours’ is reversed for a rebase.
$ git checkout --theirs -- .

# tell git that conflicts have been resolved (after we took our side)
$ git add -A

# explicitly take our side of all deletes
$ git diff --name-only --diff-filter=UD | xargs -n1 git rm

# proceed to rebase our changes, expect this to succeed
$ git rebase –continue && echo “SUCCESS!”

所有这些都可以安排到一个命令、别名或一个 shell 函数中:

$ git rebase their_branch || ((git checkout --theirs -- . \
|| (git diff --name-only --diff-filter=UD | xargs -n1 git rm) && git add -A) \
&& git rebase --continue)

如果您的 rebase 恰好成功,|| 将避免多余的脚本解决方案,并在适当的情况下停在您的 rebase 成功的第一个状态。

这是一个玩具示例,用于说明文件删除的 rebase ,

# their_branch = master, our dev branch = foo
$ cd /tmp/toy-repo
$ git init . && touch README && git add README && git commit -m "add README"
$ git checkout -b foo && git rm README && git commit -m "rm README"
$ git checkout master && echo "changing README" >> README && git add README && git commit -m "modify README"
$ git checkout foo && git rebase master || ((git checkout --theirs -- . || (git diff --name-only --diff-filter=UD | xargs -n1 git rm) && git add -A) && git rebase --continue)
$ git log
a3730c5 rm README // on foo, rebased
55c9074 modify README // on master
1fa1398 add README // on master

关于Git Rebasing onto generated files(通过删除自动解决删除/更改冲突),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17717685/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com