[Git] git merge and conflict


git merge and conflict


操作が大きくなると、メインノードからブランチが除去されて処理されます.処理終了後にMaster Branchでコンテンツをマージ同じファイルで同じ行に対して行った変更が重複または削除された場合、Gitは自動的にマージできず、競合します.
実際、衝突を避けるためには、コミュニケーションを円滑にすることが重要ですが、多くの人がプロジェクトに参加したり、プロジェクト群が大きくなったりすると、衝突が発生することがよくあります.そのため、ソリューションを理解することが重要です.簡単な例で衝突を解決します~

1.masterでコンテンツを作成してコミットする

# master branch에 파일작성하기 
suy2on@YEONui-MacBookPro merge % vi 1.txt
suy2on@YEONui-MacBookPro merge % cat 1.txt
this is merge and conflict test file
this line is written by master 
# commit
suy2on@YEONui-MacBookPro merge % git add .  
suy2on@YEONui-MacBookPro merge % git commit -m '1st commit in master'
[master (root-commit) 6f9c9a7] 1st commit in master
 1 file changed, 2 insertions(+)
 create mode 100644 1.txt

2.問題ブランチを開き、同じファイルを修正して提出する

# issue branch 파고 checkout 
suy2on@YEONui-MacBookPro merge % git branch issue
suy2on@YEONui-MacBookPro merge % git checkout issue
Switched to branch 'issue'

# 같은 파일 수정 
suy2on@YEONui-MacBookPro merge % vi 1.txt
suy2on@YEONui-MacBookPro merge % cat 1.txt
this is merge and conflict test file
this line is written by issue 

# commit
suy2on@YEONui-MacBookPro merge % git commit -am '1st commit in issue'
[issue 6ac6a1d] 1st commit in issue
 1 file changed, 1 insertion(+), 1 deletion(-)

3.メインブランチに戻り、問題で変更された同じ行を変更します。

suy2on@YEONui-MacBookPro merge % git checkout master
Switched to branch 'master'

# master branch에서는 내용이 그대로입니다
suy2on@YEONui-MacBookPro merge % cat 1.txt
this is merge and conflict test file
this line is written by master 

# master branch에서 두번째 줄은 건들지 말라고 적겠습니다 
suy2on@YEONui-MacBookPro merge % vi 1.txt
suy2on@YEONui-MacBookPro merge % cat 1.txt
this is merge and conflict test file
this line is written by master, nobody can modify this line  

4.問題ブランチをプライマリブランチにマージ

# 충돌발생 : 자동머지에 실패했다고 나오네요 아주자세하게 설명해줍니다!
suy2on@YEONui-MacBookPro merge % git merge issue
Auto-merging 1.txt
CONFLICT (content): Merge conflict in 1.txt
Automatic merge failed; fix conflicts and then commit the result.

5.競合の理解

  • Git status:衝突を非常に友好的に解決し、Gitに提出するように要求します.また、試行したmergeに戻る場合はgit merge--abortを実行するよう求められます.まだあります.txtファイルが衝突し、修正が重なった(襟が親切)👍)
  • On branch master
    You have unmerged paths.
      (fix conflicts and run "git commit")
      (use "git merge --abort" to abort the merge)
    
    Unmerged paths:
      (use "git add <file>..." to mark resolution)
    	both modified:   1.txt
  • 競合するファイルに入ります.競合するファイルは、次の図のように変更されます.すなわち、競合が発生した部分を詳細に説明します.まず、HEADは現在検出されているブランチです.マスターでしょうか?そこで「this line iswrite by master,nobon can modify this line」という文が問題分岐で「this line iswrite by public」と教えてくれます!
  • suy2on@YEONui-MacBookPro merge % cat 1.txt
    this is merge and conflict test file
    <<<<<<< HEAD
    this line is written by master, nobody can modify this line  
    =======
    this line is written by issue 
    >>>>>>> issue
    

    6.mergetool競合の解決


    mergetoolを利用して衝突を解決しましょう!
    きれいにするために、衝突も見えますし、修復も便利です.複数のタイプが事前に設定されていない場合は、mergetoolから選択を求められます.Vimdiffで作っただけです
    suy2on@YEONui-MacBookPro merge % git mergetool
    
    This message is displayed because 'merge.tool' is not configured.
    See 'git mergetool --tool-help' or 'git help config' for more details.
    'git mergetool' will now attempt to use one of the following tools:
    tortoisemerge emerge vimdiff
    Merging:
    1.txt
    
    Normal merge conflict for '1.txt':
      {local}: modified file
      {remote}: modified file
    Hit return to start merge resolution tool (vimdiff): vimdiff
    ウィンドウが開きますこのウィンドウには一度に4つのファイルが表示されます.まず、上の大きい3つのファイルの下に1つのファイルがあります.上の3つは左からLOCAL BASE REMOTEと書いてあります
    通常Gitで使用される概念とは異なり,BASEは問題分岐を初めて発行したときの状態である.つまり、どちらも修正前の状態です.LOCALは、現在のメインブランチに最終的にマージされるページファイルです.REMOTEは、問題ブランチでマージされたファイルです.一番下のファイルは、最終的にマージするファイルの内容です.
    赤は衝突する部分です下部で、最後にマージするファイルにカーソルを置き、まず競合を処理します.

    次に<:difg選択状態の最初の2文字>を書き、enterを打つ.マスターを使うことにした内容は、diffg LOこれにより、ドキュメントは自動的にマスターの内容になります.

    今逃げるために:wqaと言いましょう.後にaを付けるのは、一度に4つのファイルを保存するためです.

    7.連結


    競合は解決されましたが、まだマージされていますので、Gitコミットを要求します.commit後のログ表示mergeが正しい🤗
    suy2on@YEONui-MacBookPro merge % git status
    On branch master
    All conflicts fixed but you are still merging.
      (use "git commit" to conclude merge)
    
    # commit하기 
    suy2on@YEONui-MacBookPro merge % git commit -m "merge conpletion" 
    [master 3fb240e] merge conpletion
    suy2on@YEONui-MacBookPro merge % git log
    commit 3fb240ef6e7770e6fcbf342f58455effada0884e (HEAD -> master)
    Merge: 5c0493b 6ac6a1d
    Author: suy2on <[email protected]>
    Date:   Fri Mar 18 02:06:14 2022 +0900
    
        merge conpletion

    8. .origファイル


    mergetoolを使用する場合.origファイルが自動的に作成されます.このファイルは、変更前にファイルを保持するために作成されます.gitignoreに挿入してgitトラッキングを防止するか、次のコマンドを使用して最初からファイルを作成しないことができます.
    git config --global mergetool.keepBackup false