GitマージとGitリベースの究極のガイド

git mergeおよびgit rebaseコマンドの究極のガイドへようこそ。このチュートリアルでは、複数のブランチをGitと組み合わせる方法について知っておく必要のあるすべてのことを学びます。

Gitマージ

このgit mergeコマンドは、別のブランチのコードベースに加えられた変更を、新しいコミットとして現在のブランチにマージします。

コマンド構文は次のとおりです。

git merge BRANCH-NAME

たとえば、現在、という名前のブランチで作業していて、という名前のブランチでdev行われた新しい変更をマージするnew-features場合は、次のコマンドを発行します。

git merge new-features

注:現在のブランチにコミットされていない変更がある場合、Gitでは、現在のブランチのすべての変更がコミットされるまでマージできません。これらの変更を処理するには、次のいずれかを実行できます。

新しいブランチを作成し、変更をコミットします

git checkout -b new-branch-name git add . git commit -m ""

それらを隠します

git stash # add them to the stash git merge new-features # do your merge git stash pop # get the changes back into your working tree

すべての変更を破棄します

git reset --hard # removes all pending changes

Gitリベース

Gitでブランチのリベースを行うことは、ブランチ全体をツリー内の別のポイントに移動する方法です。最も簡単な例は、ツリーのさらに上にブランチを移動することです。ポイントAでマスターブランチから分岐したブランチがあるとします。

 /o-----o---o--o-----o--------- branch --o-o--A--o---o---o---o----o--o-o-o--- master

リベースするときは、次のように移動できます。

 /o-----o---o--o-----o------ branch --o-o--A--o---o---o---o----o--o-o-o master

リベースするには、マスターブランチのリベースに必要なすべてのコミットがあることを確認してください。リベースするブランチをチェックして入力しますgit rebase master(ここで、masterはリベースするブランチです)。

別のブランチにリベースすることも可能です。たとえば、別のブランチに基づいていたブランチ(機能と呼びましょう)がマスターに基づいてリベースされます。

 /---o-o branch /---o-o-o-o---o--o------ feature ----o--o-o-A----o---o--o-o-o--o--o- master

ブランチをチェックアウトした後、git rebase master branchまたはgit rebase masterチェックアウトすると、次のようになります。

 /---o-o-o-o---o--o------ feature ----o--o-o-A----o---o--o-o-o--o--o- master \---o-o branch

コンソールでインタラクティブなGitリベース

git rebaseコミットのリストとともにコンソールで使用するには、リベースで選択、編集、またはドロップできます。

  • 入力しgit rebase -i HEAD~5、最後の番号がレビューしたい最新の後方からのコミットの任意の数であると。
  • vimのでは、プレスesc、そしてiテストの編集を開始します。
  • 左側pickで、以下のコマンドのいずれかでを上書きできます。コミットを前のコミットに押しつぶしてコミットメッセージを破棄する場合は、コミットfの代わりに入力しますpick
  • テキストエディタを保存して終了します。
  • リベースが停止したら、必要な調整を行い、git rebase --continueリベースが成功するまで使用します。
  • リベースに成功した場合は、変更を強制的にプッシュしてgit push -f、リベースされたバージョンをリモートリポジトリに追加する必要があります。
  • マージの競合がある場合は、このガイドの提案に従うなど、これを修正する方法がいくつかあります。1つの方法は、テキストエディターでファイルを開き、不要なコードの部分を削除することです。次に、を使用しgit add てからgit rebase --continue。を入力して競合するコミットをスキップし、コンソールでgit rebase --skip実行git rebase --abortしてリベースを停止できます。
pick 452b159  pick 7fd4192  pick c1af3e5  pick 5f5e8d3  pick 5186a9f  # Rebase 0617e63..5186a9f onto 0617e63 (30 commands) # # Commands: # p, pick = use commit # r, reword = use commit, but stop to edit the commit message. # e, edit = use commit, but stop to amend or add commit. # s, squash = use commit, meld into previous commit and stop to edit the commit message. # f, fixup = like "squash", but discard this commit's log message thus doesn't stop. # x, exec = run command (the rest of the line) using shell # d, drop = remove commit # # These lines can be re-ordered; they are executed from top to bottom. # # If you remove a line here THAT COMMIT WILL BE LOST. # # However, if you remove everything, the rebase will be aborted. # # Note that empty commits are commented out

競合のマージ

マージの競合とは、競合する方法で同じ行を変更する別々のブランチでコミットを行う場合です。これが発生した場合、Gitは次のようなエラーメッセージで保持するファイルのバージョンを認識しません。

CONFLICT (content): Merge conflict in resumé.txt Automatic merge failed; fix conflicts and then commit the result.

あなたが見ればresumé.txt、あなたのコードエディタでファイルの競合が起こった場合は、あなたが見ることができます:

<<<<<<>>>>>> updated_address

Gitはファイルにいくつかの行を追加しました:

  • <<<<<<< HEAD
  • =======
  • >>>>>>> updated_address

Think of  ======= as the dividing line of the conflict. Everything between <<<<<<< HEAD and ======= is the content of the current branch that the HEAD ref is pointing to. On the other hand, everything between  ======= and >>>>>>> updated_address is the content in the branch being merged, updated_address.

Git Merge vs Git Rebase

Both git merge and git rebase are very useful commands, and one is not better than the other. However, there are some very important differences between the two commands that you and your team should take into consideration.

Whenever git merge is run, an extra merge commit is created. Whenever you are working in your local repository, having too many merge commits can make the commit history look confusing. One way to avoid the merge commit is to use git rebase instead.

git rebase is a very powerful feature. That being said, it is risky as well if it is not used in the right way. git rebase alters the commit history, so use it with care. If rebasing is done in the remote repository, then it can create a lot of issues when other developers try to pull the latest code changes from the remote repository. Remember to only run git rebase in a local repository.

That's all you need to know to merge and rebase with the best of 'em.