master を作業中の現在のブランチにプルし、競合を確認するにはどうすればよいですか?
また、マージまたはリベースする必要がありますが、どちらが正しいかわかりません。
まず、リモートからすべてのブランチをプルします
git pull origin
これを行うと、すべてのブランチがプルされます(マスターを含む)。
ここで、マスターを現在のブランチにマージしたいので、次のようにします。
git merge master
競合が自動的に解決された場合は、これで完了です。
変更が自動的にマージされなかったと表示された場合は、競合を解決する必要があります。
競合を解決するには、〜/.gitconfigを編集して追加します
[merge]
tool = meld
次に、meld diffツールをインストールします(たとえば、Ubuntuでは実行しますsudo aptitude install meld
このようなウィンドウが表示されます
左側にローカルバージョンがあります。右側には、リモートバージョンがあります。
真ん中には、マージ後の目的の状態があります。両側からすべてのビットを選択して選択し、それらを中央に配置したら、保存(CTRL + S)してmeldを終了します。Gitは、マージする必要のある次のファイルについて通知します。マージが完了するまで同じことを行います。
これの最後に実行git diff
して、実行したマージが正しいことを確認できます。
また、コードを実行して、希望どおりに機能することを確認します。
次に、コミットgit commit -am "commit_message"
して、変更をブランチにプッシュします。
なぜ現在のブランチにプルする必要があるのですか? トラブルのように聞こえます。
最新のマスターを手に入れて、違いを比較してみませんか?そうすれば、何をしているのかわからないままマージすることはありません。
この場合:
# in your master branch do
git pull origin master
作業中の機能ブランチに切り替えます。
git checkout your_branch_name
新しいブランチに入ったので、違いを確認できます (緑は追加したもので、色もオンになっていると仮定します)。
git diff master
もちろん、チェックアウトを行わなくてもマスターとの差分を見ることができます。その場合、オリジン マスターをプルしてから diff を実行します。
# in master
git pull origin master
# now do a diff while still in master
git diff your_new_feature_branch
マージとリベースには、それぞれ長所と短所があります。
リベースの利点: 「マスター」の現在のヘッドが現在のブランチの祖先になるという点で、コミット履歴を「よりクリーン」に保ちます。共通の祖先が歴史に深く埋もれているのを好まない人もいます。一部の場所では、コミットする前に機能ブランチを常に master にリベースすることがポリシーになっています。
リベースの欠点: ブランチの履歴を完全に書き換えます (すべての sha1 が異なります)。これは、あなたまたは他の誰かがフィーチャー ブランチからブランチを作成し、それを再びマージしようとした場合に問題を引き起こす可能性があります。
経験則として考えられるのは、広く公開されておらず、他のブランチの基礎になっていないブランチをリベースすることです。