10

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、 remove bar.txt、そしてgit rebase masterもう一度使用して、リベースを中止できることはわかっています。しかし、最初に中止せずにリベースを続行するにはどうすればよいでしょうか?

4

5 に答える 5

4

問題のあるコミットのパッチを手動で適用し、インデックスに追加するという解決策を見つけました。

$ 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
于 2010-09-24T17:22:37.223 に答える
2

git rebase正しく動作しています。同じパス名のファイルを書き出すコミットにアクセスしているときに、追跡されていないファイルが破壊されないように保護しています。

リベースの最新のステップだけを再試行する方法はないようです。通常、リベースが一時停止すると、インデックスに競合が残ります。ただし、この場合、追跡されていないファイルが追跡されたファイルに変換されるため、インデックスでこの問題にフラグを立てることはできません。これはおそらく、のUIのちょっとしたラフスポットですgit rebase。内部状態()を保存するために使用するディレクトリを掘り下げて.git/rebase-apply、「現在の」パッチを手動で適用することもできますが、中止して再起動する方がおそらく簡単です(ただし、非常に長いシリーズをリベースしている場合は、高速ではない可能性があります)。


の追加がbar.txt間違いであると考えられる場合は、とにかく履歴を書き換えているので、を使用git rebase -iしてからかい、追加と削除を削除することを検討してください。 それでも競合が発生しますが、以下のメソッドは。を使用して適用することもできます。インタラクティブなリベースでは通常、これら2つのセクション間で複数のコマンドが必要になるため、最後のスクリプトは2つの部分(「セットアップ」と「リベース結果の組み込み」)に分割する必要があります。bar.txt
git rebase -itemp/


競合するファイルを一時的に脇に移動し、リベースをやり直します。

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

このような競合するファイルが多数あると予想される場合は、追跡されていないファイルがないことを確認できる別のクローンでリベースを実行することを検討してください。おそらく最も難しい部分は、追跡されていないファイルがリベースの結果と競合しないことを確認することです(これをgit checkout rebased-topic達成します。追跡されていないファイルがリベースの結果と競合する場合は中止します)。

: "Note: will destroy
:     * 'rebased-topic' branch
:     * 'temp' directory"
( set -x &&
  : '*** Clearing temp/' &&
  rm -rf temp/ &&

  : '*** Making sure we have topic checked out' &&
  git checkout topic

  : '*** Cloning into temp/' &&
  git clone . temp && 

  : '*** Rebasing topic onto master in temp/ clone' &&
  ( cd temp &&
  git rebase origin/master
  ) &&

  : '*** Fetching rebase result from topic/ into local rebased-topic branch' &&
  git fetch -f temp topic:rebased-topic &&

  : '*** Checking rebased-topic for conflicts with untracked files' &&
  git checkout rebased-topic &&

  : '*** Resetting topic to tip of rebased-topic' &&
  git branch -f topic rebased-topic &&

  : '*** Returning to topic branch' &&
  git checkout topic &&

  : '*** Deleting rebased-topic branch' &&
  git branch -d rebased-topic &&

  : '*** Deleting temp/' &&
  rm -rf temp/
)
于 2010-09-22T04:04:46.837 に答える
2

リベースを試みる前にコミットする必要があります。そうしないとうまくいくこともありますが、そうすべきではありません。

なんらかの理由でコミットするのが苦手な場合は、少なくとも stash を使用できます (これはほぼ同じことを行います)。

于 2010-09-15T20:17:22.360 に答える
0

ファイルの削除後にGITがリベースを続行するために、空白の変更を追加してから、その変更を加えたファイルを「gitadd」しました。

于 2010-09-21T23:27:46.463 に答える
0

これは私と数人のチームメンバーに何度も起こりました...通常、同じブランチで作業し、頻繁にコミットする場合。

クライアントに SmartGit を使用すると、SmartGit はクリーンなレポをgit status表示しますが、変更されたランダムなファイルが多数表示されます。

もう一度これに遭遇したところgit checkout .、問題が解決したことがわかりました。これらの「目に見えないローカル変更」を破棄し、プル (および発信コミットのリベース) を続行できるようにしました。

今後の参考のためにここに書き留めておくことにしました。おおむね、あなたは意図的な変更をコミットしており、意図しない変更を破棄しても問題ないと思います。その場合は、git checkout .(うまくいけば)それを行う必要があります。

乾杯

于 2015-08-24T20:13:41.457 に答える