4

最初にチェックアウトマスターを実行せずに、FeatureBranchからマスターにマージしたいと思います。私は試しました(FeatureBranchにいます)

git push . master

しかし、私は(ある程度驚いたことに)得ました:

Everything up-to-date

マスターに(まだ)存在しないFeatureBranchにコミットがあるにもかかわらず。

私が「ワンステップのローカルプッシュ」を実行できるようにしたい理由は次のとおりです。

  1. マスターブランチにいる同僚に変更を加えたい
  2. ,,チェックアウトマスターの追加手順なしで''
  3. したがって、引き続きFeatureBranchにとどまることができます
  4. リポジトリ内のdirs/ファイルと関係がある多くのツールを混乱/警告する多くのファイルの急速な変更を回避します

私はさまざまな方法でより多くのステップでそれを行うことができることを知っています。しかし、これに対するワンステップの解決策があるかどうか疑問に思います(あるべきだと思います)。

衝突が発生した場合、とにかくマスターに切り替える必要があると思います。しかし、ほとんどの場合、競合は発生しないため、ワンステップソリューションの恩恵を受けることができます。

私のgitバージョン:

git --version
git version 1.6.5.1.1367.gcd48

(Windows)

TIA
karolrvn

4

5 に答える 5

2

pushコマンドがそのように動作する理由についての質問について...

プッシュは、リポジトリ内のブランチ間ではなく、あるリポジトリから別のリポジトリにコミットを伝播するために使用されます。あなたの場合、1つのリポジトリから同じリポジトリにプッシュしているので、答えは「すべてが最新」です。この場合、2つの異なるブランチに名前を付けているという事実は関係ありません。

于 2010-02-20T13:35:24.640 に答える
1

現在のブランチ以外のブランチにコミットすることはできません。言い換えると、によって作成された新しいノードgit commitは常に現在のHEADの子です。

ライブ開発環境でブランチを切り替えるオーバーヘッドを回避するために、別の「ステージング」リポジトリを使用することがあります。

# Currently working on branch 'foo' in $SOME_DIR/main-repo
# main-repo is a local clone of shared-repo

# Create the staging repo alongside the existing main-repo
cd $SOME_DIR
git clone shared-repo staging-repo
cd staging-repo
git remote add local ../main-repo

# Switch back to main-repo and continue working
cd main-repo
# (Make changes and commit to branch foo ...)

# Switch to the staging repo
cd $SOME_DIR/staging-repo

# Make sure we are up to date with shared repo (*)
git pull

# Merge changes from main-repo
git fetch local
git merge local/foo

# Push changes up to the shared repo
git push

このアプローチの潜在的な問題は、ブランチ'foo'で行われた変更と、その間にshared-repo/masterで行われた変更をマージした結果をテストできないことです(*)。変更の性質によっては、これで問題ない場合もありますが、ほとんどの場合、共有リポジトリにプッシュする前に、少なくとも簡単な健全性チェック(たとえば、コードがまだコンパイルされていることを確認する、スモークテストを実行する)を実行する必要があります。

これを行うには、次のいずれかを行う必要があります。

  1. build staging-repo-しかし、この場合、マージはmain-repoで直接行われた可能性があります
  2. main-repoとは別のビルド環境にstaging-repoがあり$SOME_OTHER_DIR/staging-repoます。これにより、メインリポジトリの環境を汚すことなく、ステージングリポジトリを構築および/またはテストできます。
于 2010-02-19T15:34:02.567 に答える
0

あなたが実際にやりたいのは、プッシュではなくマージだと思われますか?残念ながら、マージのターゲットであるブランチにいなければ、それは不可能だと思います。そのため、コマンドシーケンスは次のようになります。

git checkout master
git merge FeatureBranch
git checkout FeatureBranch

この操作全体は1秒もかからないはずなので、なぜこのためにマスターブランチに変更することに強く反対しているのかよくわかりません...

于 2010-02-19T20:20:22.600 に答える
0

「チェックアウトなしでブランチをマージする」という質問は、チェックアウトが必要な理由を説明する優れた回答を提供します。
(ターゲットブランチがチェックアウトされた状態で)別のリポジトリを保持することは別の方法です。

しかし、要点は残っています。プッシュ/プルリモートリポジトリに関するものです。
チェックアウトはローカルリポジトリに関するものです。

Gitデータトランスポートコマンド

そのスキーマを念頭に置いている場合は、にプッシュしないことに気づきますmaster

于 2012-09-27T06:43:15.237 に答える
0

私も同じ問題を抱えていましたが、あなたの考えに基づいて、解決策は非常に簡単であることがわかりました。

git push . HEAD:master

これは、マスターを現在のヘッドに早送りできる限り機能します。つまり、マスターで現在のブランチを開始し、それ以降、マスターで新しいコミットがない場合に限ります。

于 2015-09-07T12:33:47.160 に答える