programing

푸시하기 전에 여러 커밋을 하나로 결합

newsource 2023. 6. 29. 20:11

푸시하기 전에 여러 커밋을 하나로 결합

이 질문은 이 작업을 수행하는 방법뿐만 아니라 Git에 대한 좋은 관행인지 나쁜 관행인지에 대한 것입니다.

지역적으로 제가 대부분의 일을 한다는 것을 고려하세요.main지점, 하지만 제가 전화할 주제 지점을 만들었습니다.feature_branch하는 과정에서feature_branch그리고 다른 일을 하기 위해 왔다 갔다 합니다.main지사님, 제가 한 번 이상의 약속을 한 것으로 드러났습니다.feature_branch하지만 매번 약속하는 사이에, 저는 어떤 압박도 하지 않았습니다.제 질문은 다음과 같습니다.

  1. 당신은 이 나쁜 관행을 고려하시겠습니까?푸시할 때마다 분기당 하나의 커밋을 유지하는 것이 더 현명하지 않을까요?푸시를 수행하기 전에 분기에 여러 커밋을 수행하는 것이 좋은 경우는 무엇입니까?

  2. 여러 커밋을 수행하는 데 가장 적합한 방법은 다음과 같습니다.feature_branchmain밀기 위한 나뭇가지?그것에 대해 걱정하지 않고 여러 커밋이 푸시되는 푸시만 하는 것이 귀찮습니까? 아니면 커밋을 하나로 병합한 후 푸시하는 것이 덜 귀찮습니까?다시, 어떻게 하는 거지?

첫 번째 질문의 경우, 아니요, 한 번에 여러 커밋을 푸시해도 문제될 것이 없습니다.대부분의 경우 작업을 몇 개의 작고 논리적인 커밋으로 나누고 싶지만, 전체 시리즈가 준비되었다고 느낄 때에만 커밋을 밀어올립니다.또는 연결이 끊어진 상태에서 로컬로 여러 커밋을 수행하고 다시 연결되면 모두 푸시할 수 있습니다.푸시당 하나의 커밋으로 제한할 이유가 없습니다.

일반적으로 각 변경 사항을 실행에 필요한 모든 사항을 포함하여 단일하고 논리적이며 일관성 있는 변경 사항을 적용하는 것이 좋습니다(코드가 손상된 상태로 유지되지 않음).두 개의 커밋이 있지만 첫 번째 커밋만 적용하면 코드가 손상될 수 있는 경우 두 번째 커밋을 첫 번째 커밋에 밀어넣는 것이 좋습니다.그러나 각 커밋이 합리적으로 변경되는 두 개의 커밋이 있는 경우 별도의 커밋으로 푸시해도 괜찮습니다.

여러커을함압다면사수있다습니용할음을려밋께를 사용할 수 .git rebase -i 당신이 지점에 점에있는우경지우▁if.topical_xFeature당신은 도망칠 것입니다.git rebase -i master창이 되고 커밋이 나열됩니다.pick첫 번째를 제외한 모든 항목을 다음으로 변경할 수 있습니다.squashGit에게 모든 변경 사항을 유지하되 첫 번째 커밋에 밀어넣으라고 할 것입니다.한 작을완후확십오시하인한료업▁out오▁check시를 확인해 보세요.master기능 분기에서 병합합니다.

git checkout topical_xFeature
git rebase -i master
git checkout master
git merge topical_xFeature

아니면, 만약 당신이 모든 것을 부수고 싶다면.topical_xFeature안으로master같이 할 수 : 다을수수있습다니행할음.

git checkout master
git merge --squash topical_xFeature
git commit

어느 것을 선택할지는 당신에게 달려 있습니다.일반적으로 여러 개의 작은 커밋을 갖는 것에 대해 걱정하지 않지만, 때때로 추가적인 사소한 커밋을 귀찮아하기 때문에 하나로 압축하면 됩니다.

코드를 누르기 전에 일반적으로 여러 커밋을 하나의 커밋으로 결합하는 방법입니다.

이를 위해 GIT에서 제공하는 'squash' 개념을 사용할 것을 제안합니다.

다음 단계를 수행합니다.

gitrebase -i master(마스터 대신 특정 커밋을 사용할 수도 있음)

모든 커밋을 표시하는 기본 대화형 편집기를 엽니다.기본적으로 단일 커밋으로 병합할 커밋을 식별해야 합니다.

이것들이 여러분의 커밋이고 편집기에서 이런 것을 보여준다고 상상해 보세요.

pick f7f3f6d changed my name a bit    
pick 310154e updated README formatting and added blame   
pick a5f4a0d added cat-file  

이러한 커밋은 일반적으로 log 명령을 사용하여 볼 수 있는 것과 반대 순서로 나열됩니다.즉, 이전 커밋이 먼저 표시됩니다.

마지막으로 커밋된 변경 사항에 대해 '선택'을 '제거'변경합니다.아래와 같은 것.이렇게 하면 마지막 두 커밋이 첫 번째 커밋과 병합됩니다.

pick f7f3f6d changed my name a bit         
squash 310154e updated README formatting and added blame   
squash a5f4a0d added cat-file

결합할 커밋이 많은 경우에도 짧은 양식을 사용할 수 있습니다.

p f7f3f6d changed my name a bit         
s 310154e updated README formatting and added blame   
s a5f4a0d added cat-file

편집을 위해 'i'를 사용하면 편집자가 삽입할 수 있습니다.결합할 이전의 커밋이 없으므로 최상위(가장 오래된) 커밋은 삭제할 수 없습니다.그래서 그것은 뽑히거나 'p'여야 합니다.'Esc'를 사용하여 삽입 모드를 종료합니다.

이제 다음 명령을 사용하여 편집기를 저장합니다.:wq

이를 저장하면 이전 세 가지 커밋의 변경 내용을 모두 소개하는 단일 커밋이 생성됩니다.

이것이 당신에게 도움이 되기를 바랍니다.

  1. 먼저 모든 것을 뒤로 하고 싶은 약속을 선택합니다.

    git reflog
    5976f2b HEAD@{0}: commit: Fix conflicts
    80e85a1 HEAD@{1}: commit: Add feature
    b860ddb HEAD@{2}: commit: Add something
    
  2. 는 선한헤선재설정로다드(습니했택택선)다(니정재)을했습니다)HEAD@{2})

    git reset b860ddb --soft
    
  3. git status을 위해 (만약을위해위)

  4. 새 커밋 추가

    git commit -m "Add new commit"
    

참고:HEAD@{0}&HEAD@{1}이제 하나의 커밋으로 병합되며, 여러 커밋에 대해서도 이 작업을 수행할 수 있습니다.

git reflog다시 표시됩니다.

git reflog
5976f2b HEAD@{0}: commit: Add new commit
b860ddb HEAD@{1}: commit: Add something

로합니다로 합니다.main분기하여 최신 상태인지 확인합니다.

git checkout main

git fetch git config에 수 .

git pull

피쳐 분기를 주 분기로 병합합니다.

git merge feature_branch

주 분기를 오리진의 상태로 재설정합니다.

git reset origin/main

Git는 이제 모든 변경 사항을 단계별 변경 사항으로 간주합니다.이러한 변경 사항을 하나의 커밋으로 추가할 수 있습니다..를 추가하면 추적되지 않은 파일도 추가됩니다.

git add --all

git commit

참조: https://makandracards.com/makandra/527-squash-several-git-commits-into-a-single-commit

번째: 푸시당 분기당 하나의 커밋만 가지라는 내용은 없습니다. 푸시는 원격 저장소에 로컬 기록(즉, 커밋 모음)을 게시할 수 있는 게시 메커니즘입니다.

번째: agit merge --no-ff topical_xFeature작업을 한 에 master에 기록합니다.master.
(으)ㄹ 수 있어요.topical_xFeature추가 진화를 위해 주변에서, 당신이 기록할 수 있습니다.master다음 병합 시 단일 새 커밋으로 사용할 수 있습니다.
만약 제거한다면,topical_xFeature그렇다면, 목표입니다.git merge --squashBrian Campbell의 답변에서 자세히 설명한 것처럼 올바른 선택입니다.)

여러 커밋을 하나로 자동화하는 툴

콘달 콜리파카의 말처럼."gitrebase -i" 사용

"기트레베이스"의 논리는

gitrebase -i를 사용할 때 git는 현재 .git/rebase-merge 디렉토리에 git-rebase-to-do 파일을 생성한 다음 git 편집기를 호출하여 사용자가 처리할 git-rebase-do 파일을 편집할 수 있도록 합니다.따라서 툴은 다음을 충족해야 합니다.

  1. Git 에디터를 우리가 제공한 도구로 수정합니다;
  2. 이 도구는 git-rebase-to-do 파일을 처리합니다.

기본 Git 편집기 수정

git config core.editor #show current default git editor
git config --local --replace-all  core.editor NEW_EDITOR # set the local branch using NEW_EDITOR as git editor

따라서 도구는 git 편집기를 변경하고 git-rebase-to-do 파일을 처리해야 합니다.아래의 파이썬을 사용하는 도구:

#!/usr/bin/env python3
#encoding: UTF-8

import os
import sys

def change_editor(current_file):
    os.system("git config --local --replace-all  core.editor " + current_file) # Set current_file as git editor
    os.system("git rebase -i") # execute the "git rebase -i" and will invoke the python file later with git-rebase-todo file as argument
    os.system("git config --local --replace-all core.editor vim") # after work reset the git editor to default

def rebase_commits(todo_file):
    with open(todo_file, "r+") as f:
        contents = f.read() # read git-rebase-todo's content
        contents = contents.split("\n")
        first_commit = True
        f.truncate()
        f.seek(0)
        for content in contents:
            if content.startswith("pick"):
                if first_commit:
                    first_commit = False
                else:
                    content = content.replace("pick", "squash") # replace the pick to squash except for the first pick
            f.write(content + "\n")

def main(args):
    if len(args) == 2:
        rebase_commits(args[1]) # process the git-rebase-todo
    else:
        change_editor(os.path.abspath(args[0])) # set git editor

if __name__ == "__main__":
    main(sys.argv)

참조: https://liwugang.github.io/2019/12/30/git_commits_en.html

다른 답들은 맞을 수도 있습니다.하지만 여기 제가 여러 번 사용한 간단한 솔루션이 있고 잘 작동합니다.

상황:기능 분기에 여러 커밋(일부 히트 및 트라이얼일 수 있음)을 만들었습니다.이제 마스터/메인 분기에 대한 최종 풀/합병 요청을 하기 전에 최신 마스터/메인 분기 위에 있는 업데이트되고 유용한 커밋 메시지와 함께 모든 커밋을 단일 커밋으로 결합하려고 합니다.

단계:1

go to the feature branch where you want to perform this action ( Better to make backup branch before proceed )

단계:2

git reset --soft origin/main

단계:3(선택 사항, 상태를 표시하기 위한 것)

git status

단계:4

git commit -m "New updated and Final commit msg"

언급URL : https://stackoverflow.com/questions/5721566/combining-multiple-commits-into-one-prior-to-push