開発ブランチをマスターとマージする


764

つまり、GitHubリポジトリに2つのブランチがmasterありdevelopmentます。示されているように、開発ブランチですべての開発を行っています。

git branch development
git add *
git commit -m "My initial commit message"
git push -u origin development

次に、developmentブランチのすべての変更をにマージしたいと思いmasterます。私の現在のアプローチは:

git checkout master 
git merge development
git push -u origin master 

私が従う手順が正しいかどうか教えてください。


7
git pull -uブランチ(複数の場合はすべてのブランチ)の上流トラッキングを設定します。いったん設定されると、追跡は持続します。継続して使用する理由はありません。
David Culp、2013年

回答:


1165

私は一般的に最初のものにマージmasterしたいdevelopmentので、もし何か矛盾があれば、developmentブランチ自体で解決でき、masterクリーンなままです。

(on branch development)$ git merge master
(resolve any merge conflicts if there are any)
git checkout master
git merge development (there won't be any conflicts now)

2つのアプローチに大きな違いはありませんが、ブランチをマージしたmaster後、まだマージしたくない場合や、マージする前に行う必要がある作業がまだあることに気づきました。、だから私はmaster最後のものまで手つかずのままにする傾向があります。

編集:コメントから

誰がいつマージしたかを追跡したい場合は、マージ--no-ff中にflagを使用できます。ワークフローで(最初のステップ)に複数回マージする必要があり、これらのコミットノードを作成してもあまり役に立たない可能性があるため、これは一般に(最後のステップ)にマージdevelopmentする場合にのみ役立ちます。mastermasterdevelopment

git merge --no-ff development

71
そのアプローチには少し欠点があります:マスターへの実際のマージはおそらく早送りマージであるため、コミットノードを作成しません。これはブランチ上の実際のコードには問題ありませんが、後でマスターに実際にマージを行ったのが誰で、そのときだったのかを後で見つけるのが難しくなります。これ--no-ffを修正するには、マスターへのマージを明示的に行う必要があります。
michas 2013年

11
はい、まさにそれ--no-ffが目的です。:)
michas 2014

19
これは、git merge --no-ff development@ electの使用法を修正するためのものです。
jewbix.cube 2016年

2
@saileshコメントに同意する場合は、git mergeフラグを含めるように回答を更新してください。
Webユーザー

2
@Mars、古い変更がコミットの直接の祖先であった場合、マージはファイルをオーバーライドします。たとえば、A->B->CマスターになるとA->X->Y、あなたの開発ブランチになります。の変更Xと競合した可能性のあるファイルの一部を変更した場合、はの祖先であるAため、競合にはなりません。失われた変更については、stackoverflow.com / questions / 7147680 /…をチェックして、変更を回復してください。AX
Sailesh 2017

103

個人的には、私のアプローチはあなたのアプローチに似ており、マスターに戻ったときにいくつかのブランチとコミットのスカッシュがあります。

私の同僚の1人は、ブランチをあまり切り替える必要がなく、次のようなものをすべて開発ブランチから実行して、開発ブランチにとどまっています。

git fetch origin master

git merge master

git push origin development:master

1行目は、前回のローカルリポジトリの更新以降、マスターになるために行われたアップストリームコミットがあることを確認します。

2番目は、それらの変更(ある場合)をマスターから開発にプルします

3番目は、開発ブランチ(現在は完全にマスターとマージされています)をorigin / masterにプッシュします。

彼の基本的なワークフローは少し間違っているかもしれませんが、それがその主な要点です。


ありがとう!これは私にはもっと直感的な意味があります。
ジェイミーニコルシェリー

2
はい-私はこれを書いているので6+年間で、私もそれを採用している-とが、rebase更新へdevの分岐の代わりにmerge
David Culp、

32

枝の知識がなくてここに来た人のために下から説明。

基本的なマスターブランチ開発ロジックは次のとおりです。別のブランチでのみ作業し、マスターを使用して別のブランチをマージします。

この方法で新しいブランチの作成を開始します。

1)ローカルディレクトリにリポジトリを複製(または新しいリポジトリを作成):

$ cd /var/www
$ git clone git@bitbucket.org:user_name/repository_name.git

2)新しいブランチを作成します。マスターブランチリポジトリの最新のファイルが含まれます

$ git branch new_branch

3)現在のgitブランチをnew_branchに変更します

$ git checkout new_branch

4)通常どおり、コーディング、コミットを行います…

$ git add .
$ git commit -m “Initial commit”
$ git push (pushes commits only to “new_branch”)

5)このブランチでジョブが終了したら、「マスター」ブランチとマージします。

$ git merge master
$ git checkout master (goes to master branch)
$ git merge development (merges files in localhost. Master shouldn’t have any  commits ahead, otherwise there will be a need for pull and merging code by hands!)
$ git push (pushes all “new_branch” commits to both branches - “master” and “new_branch”)

更新:変更の視覚的なツリーを表示し、すべてのロジックとコミットをよりよく表示するには、GitKrakenを使用することを強くお勧めします。


私はマスターに取り組んでいないというあなたのアプローチが好きでした。しかし、今日gitflowで遊んでいたときに、のreleaseブランチを作成しましたdevelop。次に、リリースノートファイルを追加してコミットしました。その後、両方にマージするリリースを終了しましたmaster/develop。しかし、私のmasterブランチには、リリースノートが新しく追加されただけでした。以前の開発コミット中に他のファイルは更新されませんでした。
アミットシャー

マスター以外のブランチで作業する場合は、そのブランチに変更をコミットしてプッシュしたことを確認してください。github.comまたはbitbucket.comのグラフィックインターフェースでファイルがどのように表示されるかを確認し、Webサイトで[そこにマージ]をクリックしてみてください。それはあなたのブランチからマスターまですべてを更新するはずです。マスターに新しいファイルがある場合は、競合しているはずであり、エラーメッセージが表示されます。十分な回答が得られたかどうかはわかりませんが、そうでない場合はメッセージをお願いします:)
Gediminas

私はsourcetreeをGUIおよびgithubリポジトリとして使用しています。リリーステストで2回試しました。マスターは最新の開発ブランチで更新されていません。
アミットシャー

作業中のブランチのファイルをライブgithub.com Webサイトで使用してみてください。彼らは押されていますか?はいの場合は、同じブランチ-Mergeをクリックしてみてください。何が起こるかがわかります。私のsourcetreeでの個人的な経験はかなり悪いです-私も私のブランチで何が起こっているのか完全に理解することができませんでした
Gediminas

詳細な説明をありがとう@Gediminas 私はあなたの答えを読む前にgitキーワードで混乱しました.. :)
Dinesh Suthar

21

Git Flowワークフローを使用できると便利です。開発ブランチをマスターに簡単にマージできます。

あなたがしたいことは、ここで言及されているgit-flowの指示に従うだけです:

手順:

  • git-flowプロジェクトをセットアップする
  • ブランチを作成し、すべてをマージして開発する
  • コマンドを実行する git flow release start <version_number>
  • 次に、リリースに意味のあるメッセージを提供します
  • コマンドを実行する git flow release finish <version_number>
  • すべてをmasterにマージし、ブランチをmasterに変更します。
  • コマンドgit pushを実行して、変更をリモートマスターに公開します。

詳細については、ページにアクセスしてください-http://danielkummer.github.io/git-flow-cheatsheet/


1
誰かがgit flowを使用する場合の解決策!
Csaba Toth

21
1. //pull the latest changes of current development branch if any        
git pull (current development branch)

2. //switch to master branch
git checkout master 

3. //pull all the changes if any
git pull

4. //Now merge development into master    
git merge development

5. //push the master branch
git push origin master

9

はい、これは正しいですが、統合の準備ができる前に変更をバッファリングするだけの非常に基本的なワークフローのように見えます。gitがサポートするより高度なワークフローを検討する必要があります。複数の機能を並行して作業できるトピックブランチアプローチや、現在のワークフローを少し拡張する卒業アプローチが好きかもしれません。


6

MacまたはUbuntuを使用している場合は、ブランチの作業フォルダーに移動します。ターミナルで

harisdevがブランチ名であるとします。

git checkout master

追跡されていないファイルまたはコミットされていないファイルがある場合、エラーが発生し、追跡されていないファイルまたはコミットされていないファイルをすべてコミットまたは削除する必要があります。

git merge harisdev 

git push origin master

ブランチを削除する最後のコマンド。

$ git branch -d harisdev

ここでMacまたはUbuntuに固有のものは何ですか?
talonx

ごめんなさい。他の回答では、ターミナルでコマンドを指定する必要があることや、ブランチを削除するコマンドについては言及されていません。実際、私はブランチを削除するためのコマンドを追加したかったので、将来開発者が同じブランチを混乱させることはありません。私はMacを使っているので、それについて述べました。あなたの質問は有効であり、これらのコマンドはいずれもMacまたはUbuntuに固有のものではありません。
Haris Np

明確にしていただきありがとうございます。
talonx 2018

5

ステップ1

新しい「dev」ブランチを作成して切り替えます。ローカルのgitファイルはリモートと同期していますが、「dev」ブランチはまだ存在していません。

git branch dev # create
git checkout dev # switch
# No need to git add or git commit, the current
# branch's files will be cloned to the new branch by-default.
git push --set-upstream origin dev # push the "dev" branch to the remote.

ステップ2

"dev"ブランチ(ステップ1を実行した場合は現在のブランチ)に変更を加え、コミットしてリモートの "dev"ブランチにプッシュします。

git add .
git commit -S -m "my first commit to the dev branch" # remove the -S if you're not "secure", secure = when you already setup crypto private and public keys (i.e "verified" green sign in github)
git push -u origin dev # push the changes to the remote, -u origin dev is optional but good to use.

ステップ3

「dev」ブランチを「master」にマージします。

git checkout dev # switch to "dev" branch if you're not already.
git merge master # optionally, this command is being used to resolve any conflicts if you pushed any changes to your "master" but "dev" doesn't have that commit.
git checkout master # switch to "master", which is the branch you want to be merged.
git merge --no-ff dev # merge the "dev" branch into the "master" one.

4

これは私が通常行う方法です。まず、変更をマスターにマージする準備ができていることを確認します。

  1. リモートサーバーからの最新の変更で開発が最新かどうかを確認します。 git fetch
  2. フェッチが完了すると git checkout master
  3. 実行して、マスターブランチに最新の更新があることを確認します。 git pull
  4. 準備が完了したら、次のようにしてマージを開始できます git merge development
  5. 変更をプッシュするとgit push -u origin master完了です。

記事では、gitのマージについて詳しく説明ています。


3

1)ブランチ開発で、次のコマンドを使用してgitステータスを確認します。

git status

コミットされていないコードがあってはなりません。そうであれば、コードを開発ブランチにプッシュします。

git add *

git commit -m "My initial commit message"

git push origin Development

2)開発ブランチで、次の2つのコマンドを実行します。

git branch -f master HEAD

git push -f origin master

開発ブランチコードをマスターブランチにプッシュします。


これはすべての開発コミットをマスターにもプッシュしますか、それとも単に新しい単一のコミットをマスターに追加しますか?
2017

1
これは実際にはどのように機能しますか?具体的には、開発中の「gitブランチマスター」は狂気のように見えます。マスターと呼ばれるブランチが既にある場合、マスターと呼ばれる新しいブランチをどのように作成できますか?docsは-fがこれを行うと言います:<branchname>を<startpoint>にリセットします。これは何を意味するのでしょうか?
ジョンリトル

この力はローカルマスターをリモートマスターにプッシュしていませんか?チームで作業している場合、これは悪い考えのようです。
Nick

-f推奨されません。
DawnSong

2

@Saileshと@DavidCulpに基づく:

(on branch development)
$ git fetch origin master
$ git merge FETCH_HEAD
(resolve any merge conflicts if there are any)
$ git checkout master
$ git merge --no-ff development (there won't be any conflicts now)

最初のコマンドは、リモートマスターに対してすべてのアップストリームコミットが行われていることを確認し、発生しないSailesh応答を確認します。

2つ目はマージを実行し、競合を作成して解決できます。

その後、マスターをチェックアウトしてマスターに切り替えることができます。

次に、開発ブランチをローカルマスターにマージします。no-ffフラグは、マージ全体を追跡可能にするために、マスターにコミットノードを作成します。

その後、マージをコミットしてプッシュできます。

この手順により、開発からマスターへのマージコミットが確実に表示され、開発ブランチを見ると、開発中にそのブランチに対して行った個々のコミットを確認できます。

必要に応じて、開発ブランチで行われた内容の概要を追加する場合は、マージコミットをプッシュする前に修正できます。

編集:私の元の答えgit merge masterは何もしないことを提案しgit merge FETCH_HEADました、オリジン/マスターをフェッチした後に行う方が良いです


2

開発ブランチを「チェックアウト」すると、...

 git add .
 git commit -m "first commit"
 git push origin dev
 git merge master

 git checkout master 
 git merge dev
 git push origin master 

1

gerritを使用している場合、次のコマンドは完全に機能します。

git checkout master
git merge --no-ff development

デフォルトのコミットメッセージで保存できます。変更IDが生成されていることを確認してください。次のコマンドを使用して確認できます。

git commit --amend

次に、次のコマンドでプッシュします。

git push origin HEAD:refs/for/refs/heads/master

以下のようなエラーメッセージが表示される場合があります。

! [remote rejected] HEAD -> refs/for/refs/heads/master (you are not allowed to upload merges)

これを解決するには、gerritプロジェクト管理者は、「refs / for / refs / heads / master」または「refs / for / refs / heads / *」という名前の別の参照をgerritに作成する必要があります(将来、すべてのブランチをカバーする予定です)。次に、この参照に対する「プッシュマージコミット」権限と、GCRを送信する必要がある場合は「送信」権限を付与します。

さて、上記のpushコマンドをもう一度試してみてください。うまくいくはずです。

クレジット:

https://github.com/ReviewAssistant/reviewassistant/wiki/Merging-branches-in-Gerrit

https://stackoverflow.com/a/21199818/3877642


1

最も簡単な解決策は

git checkout master
git remote update
git merge origin/Develop -X theirs
git commit -m commit -m "New release"
git push --recurse-submodules=check --progress "origin" refs/heads/Master

これにより、使用中のすべてのブランチの履歴も保持されます


-4
1. //push the latest changes of current development branch if any        
git push (current development branch)

2. //switch to master branch
git checkout master 

3. //pull all the changes if any from (current development branch)
git pull origin (current development branch)

4. //Now merge development into master    
git merge development

5. //push the master branch
git push origin master

Error
To https://github.com/rajputankit22/todos-posts.git
 ! [rejected]        master -> master (fetch first)
error: failed to push some refs to 'https://github.com/rajputankit22/todos-posts.git'
hint: Updates were rejected because the remote contains work that you do
hint: not have locally. This is usually caused by another repository pushing
hint: to the same ref. You may want to first integrate the remote changes
hint: (e.g., 'git pull ...') before pushing again.
hint: See the 'Note about fast-forwards' in 'git push --help' for details.

Then Use 
5. //push the master branch forcefully
git push -f origin master

1
ローカルブランチがリモートブランチからのコミットを欠落している理由が明確でない限り、エラーが発生した場合に強制プッシュすることはほとんど正しいことではありません。一般的には、ステップ3に戻ったほうがよいでしょうpull。また、この回答が既存の回答と比較してどのような価値を追加するかは明確ではありません。
カイルストランド
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.