git rebase,“;将被覆盖“;,及;没有更改-您是否忘记使用';git add'&引用;

git rebase,“;将被覆盖“;,及;没有更改-您是否忘记使用';git add'&引用;,git,git-rebase,Git,Git Rebase,git-rebase在将文件添加到存储库,然后从存储库中删除,然后添加到工作目录(但不是存储库)的某些情况下,似乎无法正常工作 以下是对我的问题的更具体描述: 如果创建了分支并从某个分支切换到 树干 并添加并提交一个文件X 在分行 随后,X被移除,并且 在分支机构中承诺 X再次在工作空间中创建 目录,但未添加或删除 承诺, 主干分支前进 然后 使用高级 主干作为基础将失败,因为 它将拒绝覆盖X 再基础也无法继续 即使工作目录X是 移开或移开 下面是在命令行上重现我的问题的脚本: git in

git-rebase
在将文件添加到存储库,然后从存储库中删除,然后添加到工作目录(但不是存储库)的某些情况下,似乎无法正常工作

以下是对我的问题的更具体描述:

  • 如果创建了分支并从某个分支切换到 树干

  • 并添加并提交一个文件X 在分行

  • 随后,X被移除,并且 在分支机构中承诺

  • X再次在工作空间中创建 目录,但未添加或删除 承诺,

  • 主干分支前进

  • 然后

  • 使用高级 主干作为基础将失败,因为 它将拒绝覆盖X

  • 再基础也无法继续 即使工作目录X是 移开或移开

下面是在命令行上重现我的问题的脚本:

git init
echo foo > foo.txt
git add .
git commit -m 'foo'
echo foo >> foo.txt
git add .
git commit -m 'foo foo'
git checkout -b topic HEAD^
git log
echo bar > bar.txt
echo baz > baz.txt
git add .
git commit -m 'bar baz'
git rm bar.txt
git commit -m '-bar' 
echo bar > bar.txt
git rebase master 
# the following output is emitted:
# First, rewinding head to replay your work on top of it...
# Applying: bar baz
# Using index info to reconstruct a base tree...
# Falling back to patching base and 3-way merge...
# error: Untracked working tree file 'bar.txt' would be overwritten by merge.  Aborting
# Failed to merge in the changes.
# Patch failed at 0001 bar baz
# 
# When you have resolved this problem run "git rebase --continue".
rm bar.txt
git rebase --continue
# the following output is emitted:
# Applying: bar baz
# No changes - did you forget to use 'git add'?
# 
# When you have resolved this problem run "git rebase --continue".
# If you would prefer to skip this patch, instead run "git rebase --skip".
# To restore the original branch and stop rebasing run "git rebase --abort".

我知道我可以使用
git-rebase--abort
,删除
bar.txt
,然后再次使用
git-rebase-master
来中止rebase。但是,如何在不首先中止的情况下继续重新设置基础?

您需要在尝试重新设置基础之前提交。如果你不这样做,它有时会起作用,但你不应该这样做


如果你因为某种原因不愿意提交,你至少可以使用stash(它做的事情大致相同)。

为了让GIT在删除文件后继续使用rebase,我添加了一个空格更改,然后“GIT添加”带有该更改的文件

git-rebase
工作正常。它可以保护您的未跟踪文件在访问要写出具有相同路径名的文件的提交时不被破坏

似乎没有一种方法可以仅重试重新基础的最新步骤。通常,当重基暂停时,它会在索引中留下冲突。但在这种情况下,它不能在索引中标记此问题,因为这样做会将未跟踪的文件转换为跟踪的文件。在
git-rebase
的UI中,这可能有点粗糙。你可以挖掘它用来存储内部状态的目录(<代码> .git/ReBaseApple < /COD>)并手动应用“当前”补丁,但是中止和重启可能更容易(但是如果你在重置一个非常长的系列中的话,可能不会更快)。

如果添加<代码> bar .txt < /代码>被认为是错误的,那么您可能会考虑使用<代码> git ReBase-i/Cux>来删除并删除<代码> bar .txt < /> >的添加和移除。 您仍然会遇到冲突,但是下面的方法也可以应用于

git-rebase-i
。最后的脚本必须分为两部分(“setup
temp/
”和“include rebase result”,因为交互式rebase通常需要在这两部分之间使用多个命令


暂时将冲突文件移到一边,然后重新设置基础

mv bar.txt +bar.txt
git rebase --abort
git rebase master

如果你期望有许多这样的冲突文件,那么你可以考虑在一个单独的克隆中进行你的重新定位,在这里你可以确定你不会有任何未被跟踪的文件。也许最棘手的部分是检查你的未跟踪文件与ReBASE的结果不冲突。(git checkout rebase主题实现了这一点;如果未跟踪的文件与rebase结果冲突,它将中止)


我找到了一个解决方案:手动应用问题提交的补丁并将其添加到索引中

$ patch -p1 < .git/rebase-apply/patch 
patching file bar.txt
patching file baz.txt
$ git add bar.txt baz.txt
$ git rebase --continue
Applying: bar baz
Applying: -bar
$patch-p1<.git/rebase应用/patch
修补文件bar.txt
修补文件baz.txt
$git add bar.txt baz.txt
$git rebase--是否继续
申请:baz
申请:-酒吧

这种情况在我和几个团队成员身上发生过很多次……通常是在处理同一分支并频繁提交时发生的

我们将SmartGit用于我们的客户机,结果是,即使SmartGit显示了一个干净的回购,一个
git状态
显示了许多随机修改的文件

我又遇到了这个问题,发现
git checkout。
为我解决了这个问题。它放弃了这些“不可见的本地更改”,让我继续进行拉取(并重新设置传出提交的时间)

我决定把它写在这里,以备将来参考。Ofc,我假设您提交了有意的更改,并且您可以放弃无意的更改。如果是这样,一个
git签出。
应该(希望)这样做


干杯

好的,但是如果是这样的话,那么我收到的错误消息是非常没有帮助的,因为它意味着可以继续重新基址。@Russell Silva:你可以继续。问题是,既然你删除了
bar.txt
重新基址
在提交过程中没有任何工作要做。
git-rebase--skip
应该解决吗e问题,因为您现在想跳过(空)提交。这有点让人困惑,我很惊讶
git-rebase
甚至可以让你继续一个肮脏的工作树,但是再一次,
git-rebase
不是为胆小鬼准备的。@mipadi:commit不是空的。在这个例子中,
baz.txt
是由添加
bar.txt
git-rebase-skip
结果导致丢失
baz.txt
。在我的情况下,文件未被跟踪的唯一原因是因为重新基础倒带。不应该倒带删除以前提交中未跟踪的文件吗?不会有数据丢失。@rehevkor5:我不确定您的情况的详细信息,但如果(例如)您有顺序提交A、B、C和D,其中只有最后一个提交了文件
frob
(即,它最初添加在D中,而不是其他地方),然后Git将(临时)删除
frob
,同时倒带以将D重新设置到某个其他基础上(例如,修改过的B)
$ patch -p1 < .git/rebase-apply/patch 
patching file bar.txt
patching file baz.txt
$ git add bar.txt baz.txt
$ git rebase --continue
Applying: bar baz
Applying: -bar