푸시하기 전에 여러 커밋을 하나로 결합
이 질문은 이 작업을 수행하는 방법뿐만 아니라 Git에 대한 좋은 관행인지 나쁜 관행인지에 대한 것입니다.
지역적으로 제가 대부분의 일을 한다는 것을 고려하세요.main
지점, 하지만 제가 전화할 주제 지점을 만들었습니다.feature_branch
하는 과정에서feature_branch
그리고 다른 일을 하기 위해 왔다 갔다 합니다.main
지사님, 제가 한 번 이상의 약속을 한 것으로 드러났습니다.feature_branch
하지만 매번 약속하는 사이에, 저는 어떤 압박도 하지 않았습니다.제 질문은 다음과 같습니다.
당신은 이 나쁜 관행을 고려하시겠습니까?푸시할 때마다 분기당 하나의 커밋을 유지하는 것이 더 현명하지 않을까요?푸시를 수행하기 전에 분기에 여러 커밋을 수행하는 것이 좋은 경우는 무엇입니까?
여러 커밋을 수행하는 데 가장 적합한 방법은 다음과 같습니다.
feature_branch
main
밀기 위한 나뭇가지?그것에 대해 걱정하지 않고 여러 커밋이 푸시되는 푸시만 하는 것이 귀찮습니까? 아니면 커밋을 하나로 병합한 후 푸시하는 것이 덜 귀찮습니까?다시, 어떻게 하는 거지?
첫 번째 질문의 경우, 아니요, 한 번에 여러 커밋을 푸시해도 문제될 것이 없습니다.대부분의 경우 작업을 몇 개의 작고 논리적인 커밋으로 나누고 싶지만, 전체 시리즈가 준비되었다고 느낄 때에만 커밋을 밀어올립니다.또는 연결이 끊어진 상태에서 로컬로 여러 커밋을 수행하고 다시 연결되면 모두 푸시할 수 있습니다.푸시당 하나의 커밋으로 제한할 이유가 없습니다.
일반적으로 각 변경 사항을 실행에 필요한 모든 사항을 포함하여 단일하고 논리적이며 일관성 있는 변경 사항을 적용하는 것이 좋습니다(코드가 손상된 상태로 유지되지 않음).두 개의 커밋이 있지만 첫 번째 커밋만 적용하면 코드가 손상될 수 있는 경우 두 번째 커밋을 첫 번째 커밋에 밀어넣는 것이 좋습니다.그러나 각 커밋이 합리적으로 변경되는 두 개의 커밋이 있는 경우 별도의 커밋으로 푸시해도 괜찮습니다.
여러커을함압다면사수있다습니용할음을려밋께를 사용할 수 .git rebase -i
당신이 지점에 점에있는우경지우▁if.topical_xFeature
당신은 도망칠 것입니다.git rebase -i master
창이 되고 커밋이 나열됩니다.pick
첫 번째를 제외한 모든 항목을 다음으로 변경할 수 있습니다.squash
Git에게 모든 변경 사항을 유지하되 첫 번째 커밋에 밀어넣으라고 할 것입니다.한 작을완후확십오시하인한료업▁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
이를 저장하면 이전 세 가지 커밋의 변경 내용을 모두 소개하는 단일 커밋이 생성됩니다.
이것이 당신에게 도움이 되기를 바랍니다.
먼저 모든 것을 뒤로 하고 싶은 약속을 선택합니다.
git reflog 5976f2b HEAD@{0}: commit: Fix conflicts 80e85a1 HEAD@{1}: commit: Add feature b860ddb HEAD@{2}: commit: Add something
는 선한헤선재설정로다드(습니했택택선)다(니정재)을했습니다)
HEAD@{2}
)git reset b860ddb --soft
git status
을 위해 (만약을위해위)새 커밋 추가
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 --squash
Brian Campbell의 답변에서 자세히 설명한 것처럼 올바른 선택입니다.)
여러 커밋을 하나로 자동화하는 툴
콘달 콜리파카의 말처럼."gitrebase -i" 사용
"기트레베이스"의 논리는
gitrebase -i를 사용할 때 git는 현재 .git/rebase-merge 디렉토리에 git-rebase-to-do 파일을 생성한 다음 git 편집기를 호출하여 사용자가 처리할 git-rebase-do 파일을 편집할 수 있도록 합니다.따라서 툴은 다음을 충족해야 합니다.
- Git 에디터를 우리가 제공한 도구로 수정합니다;
- 이 도구는 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
'programing' 카테고리의 다른 글
오라클에서 열의 가장 긴 행 길이 찾기 (0) | 2023.06.29 |
---|---|
Spring Data MongoDB: "주체 관계"를 구현하는 방법은 무엇입니까? (0) | 2023.06.29 |
테이블에서 다른 테이블의 행당 여러 행 가져오기 (0) | 2023.06.29 |
iAsyncCursor는 mongodbc# 드라이버와의 반복에 어떻게 사용됩니까? (0) | 2023.06.29 |
둥근 모서리로 레이아웃을 만드는 방법...? (0) | 2023.06.29 |