1

プロジェクトを完了したばかりで、その履歴にいくつかの変更を加えて、見栄えを良くしたいと考えています。私はすでにプロジェクトをプッシュしましたが、まだ誰もそれをフォークしたり作業したりしていないので、履歴を書き換えても誰も影響を受けません。

私はいくつかの問題に出くわしました。リベース中に、コミット7aba66bを適用できないというメッセージが表示されます。

免責事項: 1 つの SO トピックに複数の質問を含めることはできないことは承知していますが、ここでは私の質問を 1 つの SO トピックにまとめることは理にかなっていると思います。 SOの不必要なフラッディング。さらに、すべてに共通の根本原因があり、1 つの回答でリストされているすべての問題が解決されると思います。私が間違っている場合は、この質問をいくつかに分けます。

まず第一に、これが私のコミット履歴です (ひどいコミットメッセージは無視してください):

* 8870309 (HEAD, origin/master, master) Completed
* 7d70396 Completed
* aa3bd79 Completed
* 96c21f6 Completed
* ba9b4dd Completed
* eafcb19 Completed
* e0a7e91 Completed
* 455688a Completed
* 9e925bf Completed
* 7c800cf Completed
* 3d3c2e8 Completed
* 2420e22 Completed
* c7a8fa5 Completed
* a750f9b Completed
* 32eef0b Completed
* f6f5852 Completed
* 3998fcd Completed
*   5bf074d path progress
|\  
| * 7aba66b Completed
* | 6b3d03d Completed
|/  
* ed3ef53 Completed
* d9c97ec Completed
* 8684c7f Completed
* f05904a Completed
* a1fdf7c Completed
*   c321a19 Merge branch 'master' of github.com:AlexVPopov/rubykoans
|\  
| * aca7987 Initial commit
* 9359dd1 Initial commit

それで、私が奇妙だと思う最初のことはこれです-両方ともマスターにあるのに、なぜ と が別々のブランチに表示されるのですかaca7987? 7aba66b実行するgit branch --contains aca7987と が得られmasterます。これは、最初にそれらの変更をコミットせずにマスターをチェックアウトしてから、ブランチ X をマスター ブランチにマージし、ブランチ X を削除してから変更をコミットするよりも、ブランチ X で変更を加えたことが原因であると思われます。

すべてのコミットのコミット メッセージを「完了」に変更したい。だから私は走りgit rebase -i 9359dd1ます。私はこれを得る:

pick aca7987 Initial commit
pick a1fdf7c Completed
pick f05904a Completed
pick 8684c7f Completed
pick d9c97ec Completed
pick ed3ef53 Completed
pick 6b3d03d Completed
pick 7aba66b Completed
pick 3998fcd Completed
pick f6f5852 Completed
pick 32eef0b Completed
pick a750f9b Completed
pick c7a8fa5 Completed
pick 2420e22 Completed
pick 3d3c2e8 Completed
pick 7c800cf Completed
pick 9e925bf Completed
pick 455688a Completed
pick e0a7e91 Completed
pick eafcb19 Completed
pick ba9b4dd Completed
pick 96c21f6 Completed
pick aa3bd79 Completed
pick 7d70396 Completed
pick 8870309 Completed

に変更pick aca7987r aca7987てエディターを閉じると、新しいエディター ウィンドウがポップアップし、 に変更Initial commitCompletedてエディターを閉じます。私はそれから得ます:

[detached HEAD da22506] Commit
 Author: AlexVPopov <xxxx@xxx.xxx>
 1 file changed, 4 insertions(+)
 create mode 100644 README.md
error: could not apply 7aba66b... Completed

When you have resolved this problem, run "git rebase --continue".
If you prefer to skip this patch, run "git rebase --skip" instead.
To check out the original branch and stop rebasing, run "git rebase --abort".

なぜこうなった?ありがとうございました。

4

2 に答える 2

1

aca7987 と 7aba66b が別々のブランチに表示される理由は、どちらもマスター上にあるためです。

* 5bf074d path progress
\
| * 7aba66b Completed
* | 6b3d03d Completed

...

* c321a19 Merge branch 'master' of github.com:AlexVPopov/rubykoans
|\
| *aca7987 Initial commit
* 9359dd1 Initial commit

現在、7ab と aca は両方とも master の履歴の一部ですが、master からの最初の親のリンクをたどっても、どちらにも遭遇することはありません。これらのコミットは両方とも別のブランチで生まれました。

これは、コミットせずにマスターをチェックアウトするよりも、ブランチ X で変更を加えたことが原因である可能性があります。

どちらかといえば逆ですが、問題ありません。

コミット履歴は重要です。ブランチ名はそうではありません。少なくとも履歴と比較しては。まだ使用しているものを忘れないことを超えて、git はそれらをまったく気にしません。それらは純粋にローカルのクリーチャーであり、レポから取得できる人なら誰でも見ることができます。あなたのレポはあなたのもの、彼らのものは彼らのものです。いくつかの一般的な状況ではgit checkout -t trunk origin/v2.0-release、その名前の方がリポジトリでの役割をよりよく表しているためかもしれません。これは非常に一般的で便利なことであり、ブランチの意味に合わせてブランチに名前を付けます。

次に [ detached HEAD da22506 ... error: could not apply 7aba66b ...] を取得します。なぜこうなった?

余談detached HEADですが、あなた (またはこの場合はリベース) が最後のチェックアウトにブランチ名を付けていないことを示す git の愛らしい言い方です。それは実際にはかなり普通のことです。

しかし、リベースは通常、マージ構造を保持しようとはしませ-p

于 2013-10-03T05:10:41.147 に答える
0

コミットされていないコンテンツを変更した場合、Git ではブランチを切り替えることができません。したがって、ブランチ X をチェックアウトし、変更を加え、マスターに戻り、X をマージしてから、変更をコミットした可能性がどのようにあるのかわかりません。これが可能であることを私が知っている唯一の方法は、追跡されていないファイルを編集し、後でそのコンテンツ全体を追加した場合です.

あなたの両方の質問に対する私の最良の理由は、master (commit 6b3d03d) と競合するブランチ X (commit 7aba66b) をマージしたことです。次に、マージ コミットで競合を解決しました (5bf074d パスの進行状況)。通常のマージを使用し (--no-ff を使用せず)、競合がなかった場合、git は master を早送りして X を含める必要があり、master の線形履歴が表示されます。

これは、あなたが持っている競合と同じ理由です。リベース コミットを見てください。git は、リベース中にマージ コミット (5bf074d) を省略します。

pick ed3ef53 Completed
pick 6b3d03d Completed
pick 7aba66b Completed
pick 3998fcd Completed

次のいずれかを実行できます。

  1. マージ中に解決したのとまったく同じ方法で、リベース中に元の競合を解決します。これにより、後続のコミットと競合しないことが保証されます。
  2. 「git rebase -i -p」を使用します。これにより、マージ コミットが保持されます。コミットを言い換えるだけであれば、競合は発生しません。
于 2013-10-02T22:57:51.927 に答える