2

私の git-svn ワークフローは次のとおりです。

本番コードは master に入り、そこから git svn dcommits/rebase を実行します。私は機能/トピックブランチに取り組んでおり、マスターにそれらを持ち込む準備が整うまで -i をマスターにリベースしてマージし続け、その後 dcommit を使用して svn トランクにプッシュします。

通常git checkout -、以前のブランチをチェックアウトすることができます。

ただし、何らかの理由でgit svn rebase、前のブランチに git checkout しようとすると、機能しません (マスターにとどまります)。つまり、私がそうしているとしましょう:

(master)$ git checkout -b my-feature-branch

そのブランチでいくつかの作業を行ってから、コミットします

(my-feature-branch)$ git commit -am "Some work"

次に、最新の変更を取り込み、すぐにブランチに戻します。

(my-feature-branch)$ git checkout master
(master)$ git svn rebase

これにより、最新の svn トランクの変更が master に取り込まれます。ここで、すぐにトピック ブランチに戻りたいと思います。

(master)$ git checkout -

この時点で、ブランチ チェックアウトはマスターのままです。ある種の操作が、私が作業した最後のブランチから飛び出していると推測していますが、これを確実に知るための内部構造についてはわかりません。

だから私の質問は、これがなぜなのか誰か知っていますか?

4

2 に答える 2

1

を実行するときは、ファイルgit checkout -を調べて、最後にチェックアウトしたブランチを見つけます。git.git/logs/HEAD

を実行すると、コマンド内の関数がgit svn rebaseトリガーされ、次のコマンドが呼び出されます。cmd_rebasegit-svn

command_noisy(rebase_cmd(), $gs->refname);

これはrebase_cmd、を呼び出します。これは次のようになります。

sub rebase_cmd {
        my @cmd = qw/rebase/;
        push @cmd, '-v' if $_verbose;
        push @cmd, qw/--merge/ if $_merge;
        push @cmd, "--strategy=$_strategy" if $_strategy;
        push @cmd, "--preserve-merges" if $_preserve_merges;
        @cmd;
}

したがって、gitこのチェーンによって構築されたコマンドラインは次のようになります。

git rebase $gs->refname

(ここ$gs->refnameで、ブランチ名に置き換えられます。)そしてgit-rebasemanページから:

<branch>が指定されている場合、gitrebaseは他の処理を行う前に自動gitチェックアウトを実行します。それ以外の場合は、現在のブランチに残ります。

rebaseコマンドはブランチ名を指定するため、チェックアウトを実行します。これにより、既にそのブランチにいる場合でもrebase、にエントリが追加されます。これが、の実行後に期待するものではない理由です。.git/logs/HEAD git checkout -git svn rebase

更新リベースがチェックアウトを実行している理由について間違っている可能性がありますが、調べると、リベース(複数の)チェックアウトを実行.git/logs/HEADしていることがはっきりとわかります。たとえば、ブランチとブランチ(からの子孫)がある場合、次のようにします。masterb1master

git checkout master
git rebase b1

ログに次のようになります。

6240c11... c4bfd14... Lars Kellogg-Stedman <lars@example.com> 
  1352952244 -0500  checkout: moving from b1 to master
c4bfd14... 6240c11... Lars Kellogg-Stedman <lars@example.com> 
  1352952260 -0500  checkout: moving from master to 6240c1154706c675d19d771ad36aebc2658a5df8^0
6240c11... 6240c11... Lars Kellogg-Stedman <lars@example.com> 
  1352952260 -0500  rebase finished: returning to refs/heads/master
于 2012-11-15T03:29:26.130 に答える
1

これは実際には git-svn とは何の関係もないようで、git でのリベースの副作用にすぎません。Agit rebaseは、現在のブランチを再チェックアウトすることを暗示しているようです。これを自分で証明するには、次のコマンドを使用します。

$ git checkout master
$ git checkout HEAD~1
 # A bunch of stuff about being in detached HEAD mode.
$ git checkout -b foo
$ git rebase master
$ git checkout -
 Already on 'foo'

これは、git rebaseを使用して HEAD をデタッチするためgit checkout -q "$onto^0"です。上記のコマンドを実行した後に .git/logs/HEAD を確認すると、「foo から 876AF98 に移動中」というエントリに続いて、「リベースが終了しました: refs/heads/foo に戻る」というエントリが表示されます。

于 2012-11-15T03:25:13.213 に答える