6

リベースでかなりの数時間遊んだ後でも、リポジトリは私が必要としているものとはまだ異なって見えます:

次のタスクを実行したいと思います。
[リベースをいじり始める前は、そのうちのいくつかは問題ありませんでした:(]

  • 一番上のコミット(「余分なものを削除しました...」)をブランチオフの前(「#226の修正」のすぐ上)に移動します。
  • 'twist/main'ブランチにある2つのコミットを結合します。「comma」と「Movedloaded...」は同じコミットである必要があり、「comma」のコミットメッセージはまったく必要ありません。
  • 新しく結合された「Moveloaded」コミットを「backup」ブランチにマージし、「twist」を取り除きます。
  • 「master」を「backup」と表示されている場所に移動します。
  • その「remote/origins / master」タグはどういう意味ですか?

ここに画像の説明を入力してください

これは多くのことを求めていると思いますが、実際のGITコマンドを含めてください。

自分で読んで試してみてもかまいませんが、期待した結果と一致しない結果に少し混乱しており、誤ってコミットを破棄したくありません。

4

3 に答える 3

8

まず、backupコミットの順序を変更します。

# Safety, should be a no-op if your gitk snapshot is accurate
git checkout backup

# Temporary branch
git branch backup-save backup

# Move top commit onto 'Fix for #226:
git rebase --onto origin/master HEAD^

# Go back to saved branch's parent (i.e. without the moved commit)
git reset --hard backup-save^

# Rebase onto the moved commit (HEAD@{1} is where HEAD was 1 step
# ago i.e. before the reset.)
git rebase HEAD@{1}

# Don't need the saved branch any more (although you might want
# to keep it for a bit just in case). This deletes it:
git branch -D backup-save

一番上のコミット メッセージを無視して、ツイストで 2 つのコミットを結合します。

git checkout twist

git reset --soft HEAD^

# Just re-save the commit message, alternatively to skip the
# editor step do this: git commit --amend -C HEAD
git commit --amend

twistブランチを にマージしbackup、ツイスト ブランチを削除します。

git checkout backup
git merge twist
git branch -d twist

移動しmasterます。いくつかの凝った方法がありますが、これが最も簡単です。master元の位置ではなく、編集された位置を指し示すことを想定していますbackup

git checkout master
git reset --hard backup

remote/origins/masterはリモート トラッキング ブランチでありmaster、リモート リポジトリ内のブランチのブランチ ポインタがどこにあるoriginか、または最後にフェッチ、プッシュ、またはプルしたときの場所を示します。

于 2010-01-17T09:26:37.697 に答える
6

恐れない方法

どんなに失敗しても、コミットが破棄されることはなく*、いつでも開始した場所に戻ることができることをお見せしたいと思います。

あなたが示したのと同じ形の偽のgitツリーを作成しました:

ここで、「バックアップ」ブランチから最後の 3 つのコミットを消去します。

$ git log --oneline
9b41f46 Removed extraneous whitespace
981e2e8 Merged the "loadscripts" function
005bc62 Pick up a few very fringe cases
07e71d9 Merged "getDepsForScript" function
...
$ git reset --hard HEAD~3
HEAD is now at 07e71d9 Merged "getDepsForScript" function
$ git log --oneline
07e71d9 Merged "getDepsForScript" function
...

おっと、それは悪かった。出発点に戻りましょう。まず、私たちが何をしたかを見てください:

$git reflog
07e71d9 HEAD@{0}: HEAD~3: updating HEAD
9b41f46 HEAD@{1}: commit: Removed extraneous whitespace
...

リセット時に git が行ったのは、HEAD がその古いコミットを指すようにすることだけだったことがわかります。しかし、コミットが実際に失われることはありませんでした。それらは孤立しただけで、ブランチの一部ではありませんでした。それらを再び「バックアップ」ブランチの一部にしましょう。

$ git reset --hard 9b41f46
HEAD is now at 9b41f46 Removed extraneous whitespace
$ git log --oneline
9b41f46 Removed extraneous whitespace
981e2e8 Merged the "loadscripts" function
005bc62 Pick up a few very fringe cases
07e71d9 Merged "getDepsForScript" function
...

Git とは、申し訳ないと言う必要がないことを意味します。

*ルーズ オブジェクトは最終的にガベージ コレクションを実行しますが、少なくとも 2 週間経過するまでは実行されません。

あなたがしたいことをする方法。

まず、マスターで 2 つのコミットを結合しましょう。

$ git checkout master
$ git rebase -i HEAD~2

Git がエディターを起動します。これを変える:

pick 6389f4e Moved "loaded" function out of "require".
pick 41fb646 comma

これに:

pick 6389f4e Moved "loaded" function out of "require".
s 41fb646 comma

そして保存します。Git は再びエディターを起動します。これを変える:

# This is a combination of two commits.
# The first commit's message is:

Moved "loaded" function out of "require".

# This is the 2nd commit message:

comma

これに:

Moved "loaded" function out of "require".

保存します。

それでは、「バックアップ」でコミットを並べ替えましょう。

$ git checkout backup
$ git rebase -i remotes/origin/master

エディターがポップアップしたら、これを変更します。

pick ec7f71c moved "loaded" function out of "require"
pick 4a76897 Replaced maploaded event
pick 07e71d9 Merged "getDepsForScript" function
pick 005bc62 Pick up a few very fringe cases
pick 981e2e8 Merged the "loadscripts" function
pick 9b41f46 Removed extraneous whitespace             <-----

これに:

pick 9b41f46 Removed extraneous whitespace             <-----
pick ec7f71c moved "loaded" function out of "require"
pick 4a76897 Replaced maploaded event
pick 07e71d9 Merged "getDepsForScript" function
pick 005bc62 Pick up a few very fringe cases
pick 981e2e8 Merged the "loadscripts" function

保存します。

次に、マージされた「Moved loaded」コミットをマスターから現在のブランチ (「バックアップ」) にチェリーピックします。

$git cherry-pick master

マスターが「バックアップ」と同じコミットを指すようにする

$git checkout master
$git reset --hard backup

ツイスト ブランチを取り除く

$git branch -D twist
于 2010-01-17T09:30:39.857 に答える
0

ここで達成しようとしていることがいくつかあり、正確に何が必要かを示した図からは少し不明確ですが、次のポインターが役立つ場合があります。

  • ブランチを移動しようとするのではなく、最初にそのブランチで行ったコミットを組み合わせてから、最終的なコミットをマスター ブランチに適用します。この時点でいくつかの競合を解決する必要があるかもしれませんが、とにかくそれを行う必要があります。これを実現する方法については、次の 2 つのヒントを参照してください。

  • 2 つのコミットを結合するには、インタラクティブな rebaseを実行できます。

  • あるブランチから単一のコミットを選択して別のブランチに適用するには、ターゲット ブランチで を使用しますgit cherry-pickgit branch -D twistwhen doneを使用して古いブランチを削除できます。

これらのヒントがあなたの目標への道につながることを願っています。

于 2010-01-17T09:31:22.583 に答える