0

短縮版:

ローカル ブランチ (A) からローカル ブランチ (B) を作成し、(A) が追跡しているのと同じリモート ブランチを追跡するようにしたいと考えています。1つのコマンドでそれを行うにはどうすればよいですか? この動作をデフォルトとして設定する方法はありますか?

完全な説明:

最近、git-svn から「純粋な」git に切り替えました。私のワークフローには非常に苛立たしい側面があり、そのワークフローを復元する方法を見つけようとしています。git-svn の場合は次のようになります。

  • リモート ブランチ (X) を追跡する新しいローカル ブランチ (A) を作成する
  • いくつかの作業を行い、いくつかのローカル コミットを行います。
  • git svn rebase-- A は X の HEAD までリベースされます
  • いくつかの作業を行い、いくつかのローカル コミットを行います。
  • 派生案があり、(A) から新しいローカル ブランチ (B) を作成します。
  • いくつかの作業を行い、いくつかのローカル コミットを行います。
  • git svn rebase-- B は​​ X の HEAD までリベースされます

純粋な git の世界で私が抱えている問題は、(A) はリモート ブランチを追跡しているが、(B) はそれを継承していないことです。を実行することで、これを明示的に設定できることを認識していgit branch --set-upstream (B) (X)ます。私が探しているのは、この追跡動作が自動的に継承される方法であるため、これを行うことを覚えておく必要git pull --rebaseがなく、作業がうまくいかないときにすべてイライラすることはありません (B)。

これの「問題」は、(A)から(B)が作られたという遺産を失う可能性があることだと私は認識しています。私はそれを気にしません。

何か案は?

4

3 に答える 3

0

集中型ワークフローを分散システムに適用しようとしています。集中的にではなく、ローカルで物事を行うことを考える必要があります。共有 (中央) リポジトリは、他の人と共有したいものを置いたり、他の人が共有したいものを取り出したりする場所です。

これが本質的にあなたが求めているものです。しかし、それが最良のワークフローだとは思いません。変更されたバージョンについては、以下を参照してください。

Create a new local branch (A) that tracks a remote branch (X)
   git clone <url> my_repo
Do some work, make some local commits.
   work, work work
   git add .
   git commit -m "commit of work"

A is rebased up to the HEAD of X.  We're operating on the same branch 
we want to rebase from the remote, so we can do it all with one command in 
this case.
   git pull --rebase

Do some work, make some local commits.
   work, work work
   git add .
   git commit -m "commit of work"

Have an offshoot idea, make a new local branch (B) from (A)
  git checkout -b idea

Do some work, make some local commits.
   work, work work
   git add .
   git commit -m "commit of work"

B is rebased up to the HEAD of X

   git rebase origin master

しかし....そのワークフロー全体は、「信頼できる情報源」としてのリモコンを中心に展開しています。それを行うためのよりgit的な方法は、ローカルを真実のソースと考え、中央リポジトリからの共有コンテンツで更新することです。違う角度からアプローチするだけで、同じことです。

ワークフローを実行する方法は次のとおりです。

リモート ブランチ (X) を追跡する新しいローカル ブランチ (A) を作成します。 git clone my_repo 何らかの作業を行い、ローカル コミットを行います。仕事、仕事 仕事 git add 。git commit -m "作業のコミット"

A is rebased up to the HEAD of X.  We use two commands here, but doing
it this way makes it easy for me to view the differences before 
doing the rebase, if I choose.
   git fetch
   git rebase origin/master

Do some work, make some local commits.
   work, work work
   git add .
   git commit -m "commit of work"

Have an offshoot idea, make a new local branch (B) from (A)
  git checkout -b idea

Do some work, make some local commits.
   work, work work
   git add .
   git commit -m "commit of work"

B is rebased up to the HEAD of X

   git fetch
   git rebase origin/master

もちろん、どちらのシナリオも、origin/master をアイデア ブランチにリベースする前に、ローカル マスター ブランチで追加作業を行っていないという事実に依存します。そうした場合、マスターでローカルで行ったコミットがなくなり、次のようにする方が効果的です。

git fetch
git checkout master
git rebase origin/master  --(make sure master is up-to-date locally)
git checkout idea
git rebase master (apply idea on top of the updated local master)
于 2012-05-18T16:36:56.013 に答える
0

まあ、最も簡単な解決策ですが、おそらく部分的な解決策は、次のことです。

git checkout -b B <remote>/X
git merge A

B が必要になる前に A を X に戻した場合、2 番目のステップは必要ありません。リモートに基づいて B をチェックアウトすると、追跡が自動的に設定されます。

1つのステップとして:

function myGitCo () { git checkout -b $1 $3; git merge $2 }   # <smiley>
于 2012-05-18T19:24:56.227 に答える
0

昔ながらのスクリプティング モジョを取り除き、このソリューションを作成し、次のスクリプトに落とし込みましbashた。perlmy-new-branch

#/bin/bash
REMOTETRACKINGBRANCH=`git branch -vvv | perl -ne '/^\*[^\[]*\[[^:\]]+[:\]]+.*$/ && s/^\*[^\[]*\[([^:\]]+)[:\]]+.*$/\1/ && print;'`
if [ -z "$REMOTETRACKINGBRANCH" ];
then
    echo "ERROR: No remote tracking branch." 1>&2
    exit 1
else
    git checkout -b $1 && git branch --set-upstream $1 $REMOTETRACKINGBRANCH
fi

これはもっと簡単かもしれませんが、正規表現をエスケープするシェルとの戦いにうんざりし、perlを使用してブルートフォースしました。

リモートトラッキングブランチを識別するための、より簡単に解析できる(そしてgit revsとして変更される可能性が低い)より配管っぽい方法があればいいのですが、AFAICT構成ファイルはそのビットの情報と解析に対して信頼できます解析よりも面倒なようgit branch -vvvです。

于 2012-05-21T12:39:02.610 に答える