2016-09-02 7 views
1

は、私が開発から機能ブランチfを作成したとき、私はこのようなコミットツリーでは、次のローカルリポジトリを考えてみましょう変更:防止ユーザーは

master --> a 
      \ 
      \ 
     develop c 
       \ 
       \ 
     feature f 

今後のいつかの新機能がありますcを開発するためにマージされてコミット私のツリーは次のようになります。

master --> a 
      \ 
       \ 
     develop c --> d --> e 
       \ 
       \ 
      feature f 

は、今私は私が開発から最新の変更を引っ張って前にコミットしないようにしたいです。私が試したものから

master --> a 
      \ 
      \ 
     develop c --> d --> e 
          \ 
          \ 
        feature f 

、一つの方法は、fに変更をプッシュして、(今新しい変更を持っている)eを開発するfをマージしようとすることです。これを行うと明らかに、gitからのエラーメッセージは、fの前にあります。これはpost-hookで行うことができます。しかし、私はgit pre-hookでそれを行うことはできますか?

もしそうなら、それを行う方法とそうでない場合は、他のやり方をお勧めします。可能であれば、コマンドが何をしているのかを説明してください(私はgitの初心者です)。

ユーザがこれを行おうとした場合に、カスタムメッセージを表示する必要があります。

ありがとうございます!

更新: 私はこれ(このスクリプトは、プリコミットフックで呼び出されます)どのよう

tomato.sh

#!/bin/bash 
WORKING_GIT_DIR=$1 
cd $WORKING_GIT_DIR 
# switch to BRANCH_TO_MERGE 
BRANCH_TO_MERGE=$2 
git checkout $BRANCH_TO_MERGE 

PARENT_BRANCH=$(git show-branch | grep '*' | grep -v "$(git rev-parse --abbrev-ref HEAD)" | head -n1 | sed 's/.*\[\(.*\)\].*/\1/' | sed 's/[\^~].*//') 
echo $PARENT_BRANCH 
# in memory merging of feature branch and parent and look for possible conflicts 
git merge-tree `git merge-base FETCH_HEAD $PARENT_BRANCH` FETCH_HEAD $PARENT_BRANCH 

のように見えるソリューションに取り組んでいます実行する

sh +x tomato.sh (PATH TO WORKING_GIT_DIR) (BRANCH_TO_MERGE) 

スクリプトがどのように動作するか

親ブランチを見つけようとします(詳細は[ここ] [2]参照)。 は、次に使用する3ウェイ・マージを実行します。

git merge-tree <base> <branch1> <branch2> 

ベース - >現在のFETCH_HEAD - 現在の親ブランチ
支社の>現在のFETCH_HEAD &親の間で最も共通の祖先を見つける/最寄りの親ブランチを
BRANCH2 - これは、MEMに与える

現在の親枝の>親/最寄りの親ブランチ実際にインデックスを変更することなく、リモートブランチとローカルブランチのoryマージ

誰かがこのスクリプトを改善した場合は、ご意見ください。

ありがとうございます!

+0

ブランチで 'git merge feature'を実行し、マージ競合を解決してからコミットします。 – Kelvin

+2

ユーザーが*ローカル*コミットを作成しないようにしたいですか?彼らがコミットするようにして、便利なときにマージ/リベースするだけです。 –

+0

@Oliverこれは良い質問だと思います。それが答えられた場合、pre-commitフックは、あなたの基礎が既に変更されていることを知らせることなく開発(=コミット)することを防ぎます。 「参照はすでに変更されました。マージを先に実行しますか?[y/n]」のような警告が表示されます。一方で、参照が何であるかについての追加情報を提供する必要があります。 – Christoph

答えて

1

私は最新の変更を開発する前にコミットしないようにしたいと思います。

のgitにコミットするように、これは不可能です

ローカルなもの、私は何が必要だと思うすべての作業をプッシュする前に開発にリベースされ、チームの理解です。これを実施することはコードレビューとなります。

そこにがあるかもしれませんは、CIでこれを強制する技術的方法です。

+0

CIで取ることができるアプローチについてもっと教えていただけますか? – lordzuko

+0

あなたの問題は技術的なものではなくチームワークだと思っていますが、teamcityがビルドステップとしてgitログにアクセスできることがわかりました。 –

+0

@ m.edmondson:gitコミットがローカルであることに同意します。しかし、残りの部分を行い、必要に応じてgitコマンドにアクセスする事前コミットフックとしてスクリプトを使用できるはずです。私が理解しているように、フックはどの言語でも構いません。例えば、 Rの例の[ここ](https://rmflight.github.io/posts/2014/02/incrementalVersionCommitHooks.html) – Christoph

1

がすでに指摘し、平野gitがpull requestのような概念は、GitHubのとビットバケットなどのオーバーレイソリューションをgitのために追加されている理由である、このようなことのために、特定のサポートを持っていない、とgerritのようなツールは、レビューのための組織のポリシーを容易アクセスなど。

質問にはgithubというタグが付いているので、あなたはそれを使用していると仮定し、ローカルフィーチャーブランチの最新状態を無視して、そこからプルリクエストを作成します。

フィーチャブランチが遅れている場合は、矛盾がある場合は、の場合、プルリクエストが表示され、マージできません。それは、フィーチャーブランチ開発者によってボールを離れ、フィーチャーブランチを更新して、それが統合されて開発されるようにすることになります。


これは概念的な競合を検出しない可能性があるラインマージ分析による自動ラインから決定は勿論です。追加のrequirementsを定義することが可能です。これは、最新でないプル要求のマージを拒否するために使用することができます。 更新:ちょうど質問Check if a PR is up to date with the target branchが来ました。

+0

私は 'git merge-tree'を使ってgitの3つの方法をマージしようとしています。これは実際にインデックスに触れることなくメモリ内で行います。助言がありますか ? – lordzuko

+0

私が構築しようとしているこのツールは、あなたが言及した2つのこれらの2つのケースに入り、 'PRがターゲットブランチで最新であるかどうかをチェックする 'は、ツールをトリガするケースであり、私はコンフリクトを行ごとのマージ分析(現時点では私は概念的なコンフリクトには関係しません)で表示するようにビルドしました。そのため、ユーザーは競合が発生する可能性のあるファイルの特定の行に直接移動できます。あなたの洞察は役に立ちました。 – lordzuko