เหตุใด git-rebase จึงทำให้ฉันมีข้อขัดแย้งในการรวมเมื่อสิ่งที่ฉันทำคือการแบน


146

เรามีพื้นที่เก็บข้อมูล Git ที่มีการกระทำมากกว่า 400 ครั้งสองสามคู่แรกนั้นมีการทดลองและข้อผิดพลาดมากมาย เราต้องการที่จะทำความสะอาดการกระทำเหล่านี้โดยการบีบลงไปในการกระทำเดียว ตามธรรมชาติแล้วการรีต git-reb ดูเหมือนจะเป็นไป ปัญหาของฉันคือมันจบลงด้วยการรวมความขัดแย้งและความขัดแย้งเหล่านี้ไม่ใช่เรื่องง่ายที่จะแก้ไข ฉันไม่เข้าใจว่าทำไมจึงควรมีข้อขัดแย้งใด ๆ เนื่องจากฉันเพิ่งจะคอมมิชชัน (ไม่ลบหรือจัดเรียงใหม่) เป็นไปได้อย่างมากที่สิ่งนี้แสดงให้เห็นว่าฉันไม่ได้เข้าใจอย่างสมบูรณ์ว่าการทำ git-rebase นั้นทำได้อย่างไร

นี่คือสคริปต์ที่ฉันใช้อยู่เวอร์ชันที่แก้ไข:


repo_squash.sh (นี่คือสคริปต์ที่ทำงานจริง):


rm -rf repo_squash
git clone repo repo_squash
cd repo_squash/
GIT_EDITOR=../repo_squash_helper.sh git rebase --strategy theirs -i bd6a09a484b8230d0810e6689cf08a24f26f287a

repo_squash_helper.sh (สคริปต์นี้ใช้โดย repo_squash.sh เท่านั้น):


if grep -q "pick " $1
then
#  cp $1 ../repo_squash_history.txt
#  emacs -nw $1
  sed -f ../repo_squash_list.txt < $1 > $1.tmp
  mv $1.tmp $1
else
  if grep -q "initial import" $1
  then
    cp ../repo_squash_new_message1.txt $1
  elif grep -q "fixing bad import" $1
  then
    cp ../repo_squash_new_message2.txt $1
  else
    emacs -nw $1
  fi
fi

repo_squash_list.txt: (ไฟล์นี้ใช้โดย repo_squash_helper.sh เท่านั้น)


# Initial import
s/pick \(251a190\)/squash \1/g
# Leaving "Needed subdir" for now
# Fixing bad import
s/pick \(46c41d1\)/squash \1/g
s/pick \(5d7agf2\)/squash \1/g
s/pick \(3da63ed\)/squash \1/g

ฉันจะฝากเนื้อหา "ข้อความใหม่" ไว้ในจินตนาการของคุณ เริ่มแรกฉันทำสิ่งนี้โดยไม่มีตัวเลือก "--strategy yours" (เช่นใช้กลยุทธ์เริ่มต้นซึ่งหากฉันเข้าใจว่าเอกสารถูกต้องจะเรียกซ้ำ แต่ฉันไม่แน่ใจว่าใช้กลยุทธ์แบบเรียกซ้ำ) และไม่ได้ใช้ ' ไม่ทำงาน นอกจากนี้ฉันควรชี้ให้เห็นว่าโดยใช้รหัสความคิดเห็นใน repo_squash_helper.sh ฉันบันทึกไฟล์ต้นฉบับที่สคริปต์ sed ทำงานและรันสคริปต์ sed เพื่อให้แน่ใจว่าทำในสิ่งที่ฉันต้องการ ( มันเป็น) อีกครั้งผมไม่ได้รู้ว่าทำไมมีจะเป็นความขัดแย้งจึงจะได้ดูเหมือนจะสำคัญมากที่จะใช้กลยุทธ์ คำแนะนำหรือข้อมูลเชิงลึกใด ๆ จะเป็นประโยชน์ แต่ส่วนใหญ่ฉันแค่ต้องการให้การบีบอัดนี้ทำงาน

อัปเดตด้วยข้อมูลเพิ่มเติมจากการสนทนากับ Jefromi:

ก่อนที่จะทำงานกับพื้นที่เก็บข้อมูล "ของจริง" ขนาดใหญ่ของฉันฉันใช้สคริปต์ที่คล้ายกันในที่เก็บข้อมูลการทดสอบ มันเป็นพื้นที่เก็บข้อมูลที่ง่ายมากและการทดสอบก็ใช้งานได้อย่างสมบูรณ์

ข้อความที่ฉันได้รับเมื่อล้มเหลวคือ:

Finished one cherry-pick.
# Not currently on any branch.
nothing to commit (working directory clean)
Could not apply 66c45e2... Needed subdir

นี่คือการเลือกครั้งแรกหลังจากการสควอชครั้งแรก การทำงานgit statusให้ผลไดเรกทอรีการทำงานที่สะอาด ถ้าฉันทำgit rebase --continueฉันจะได้รับข้อความที่คล้ายกันมากหลังจากคอมมิทเพิ่มอีกสองสามข้อ ถ้าฉันทำมันอีกครั้งฉันจะได้รับข้อความที่คล้ายกันมากหลังจากทำสองสามครั้ง ถ้าฉันทำมันอีกครั้งคราวนี้ผ่านไปหนึ่งร้อยคอมมิชชันและให้ข่าวสาร:

Automatic cherry-pick failed.  After resolving the conflicts,
mark the corrected paths with 'git add <paths>', and
run 'git rebase --continue'
Could not apply f1de3bc... Incremental

ถ้าฉันวิ่งgit statusฉันก็จะได้:

# Not currently on any branch.
# Changes to be committed:
#   (use "git reset HEAD <file>..." to unstage)
#
# modified:   repo/file_A.cpp
# modified:   repo/file_B.cpp
#
# Unmerged paths:
#   (use "git reset HEAD <file>..." to unstage)
#   (use "git add/rm <file>..." as appropriate to mark resolution)
#
# both modified:      repo/file_X.cpp
#
# Changed but not updated:
#   (use "git add/rm <file>..." to update what will be committed)
#   (use "git checkout -- <file>..." to discard changes in working directory)
#
# deleted:    repo/file_Z.imp

บิต "ทั้งแก้ไข" ฟังดูแปลกสำหรับฉันเนื่องจากนี่เป็นเพียงผลลัพธ์ของการเลือก นอกจากนี้ยังเป็นที่น่าสังเกตว่าถ้าฉันดูที่ "ความขัดแย้ง" มันจะลดลงไปเป็นบรรทัดเดียวโดยมีหนึ่งเวอร์ชันเริ่มต้นด้วยอักขระ [แท็บ] และอีกอันหนึ่งมีช่องว่างสี่ช่อง ดูเหมือนว่านี่อาจเป็นปัญหากับวิธีการตั้งค่าไฟล์ปรับแต่งของฉัน แต่ไม่มีการเรียงลำดับใด ๆ (ฉันทราบว่า core.ignorecase ถูกตั้งค่าเป็นจริง แต่เห็นได้ชัดว่า git-clone ทำโดยอัตโนมัติฉันไม่แปลกใจเลยเมื่อพิจารณาว่าแหล่งต้นฉบับอยู่บนเครื่อง Windows)

ถ้าฉันแก้ไข file_X.cpp ด้วยตนเองมันจะล้มเหลวหลังจากนั้นไม่นานด้วยความขัดแย้งครั้งนี้ระหว่างไฟล์ (CMakeLists.txt) ที่หนึ่งเวอร์ชันคิดว่าควรมีอยู่และเวอร์ชันหนึ่งคิดว่าไม่ควร ถ้าฉันแก้ไขข้อขัดแย้งนี้โดยบอกว่าฉันต้องการไฟล์นี้ (ซึ่งฉันทำ) ไม่กี่ข้อตกลงภายหลังฉันจะได้รับความขัดแย้งอื่น (ในไฟล์เดียวกันนี้) ซึ่งตอนนี้มีการเปลี่ยนแปลงที่ค่อนข้างเล็กน้อย ยังคงมีเพียงประมาณ 25% ของวิธีการผ่านความขัดแย้ง

ฉันควรจะชี้ให้เห็นเช่นนี้อาจเป็นสิ่งสำคัญเพราะโครงการนี้เริ่มต้นขึ้นในพื้นที่เก็บข้อมูล svn ประวัติเริ่มต้นนั้นน่าจะถูกนำเข้าจากที่เก็บ svn นั้น

อัปเดต # 2:

บนความสนุกสนาน (ได้รับอิทธิพลจากความคิดเห็นของ Jefromi) ฉันตัดสินใจเปลี่ยนแปลง repo_squash.sh ของฉันเป็น:

rm -rf repo_squash
git clone repo repo_squash
cd repo_squash/
git rebase --strategy theirs -i bd6a09a484b8230d0810e6689cf08a24f26f287a

แล้วฉันก็ยอมรับรายการต้นฉบับตามที่เป็นอยู่ คือ "การปฏิเสธ" ไม่ควรเปลี่ยนแปลงอะไรเลย มันจบลงด้วยผลลัพธ์เดียวกันอธิบายก่อนหน้านี้

อัปเดต # 3:

หรือถ้าฉันไม่ใช้กลยุทธ์และแทนที่คำสั่งสุดท้ายด้วย:

git rebase -i bd6a09a484b8230d0810e6689cf08a24f26f287a

ฉันไม่ได้รับปัญหาการ "ปฏิเสธที่จะยอมรับ" อีกต่อไป แต่ฉันยังเหลืออยู่กับความขัดแย้งอื่น ๆ

อัปเดตด้วยที่เก็บของเล่นที่สร้างปัญหาขึ้นใหม่:

test_squash.sh (นี่คือไฟล์ที่คุณใช้งานจริง):

#========================================================
# Initialize directories
#========================================================
rm -rf test_squash/ test_squash_clone/
mkdir -p test_squash
mkdir -p test_squash_clone
#========================================================

#========================================================
# Create repository with history
#========================================================
cd test_squash/
git init
echo "README">README
git add README
git commit -m"Initial commit: can't easily access for rebasing"
echo "Line 1">test_file.txt
git add test_file.txt
git commit -m"Created single line file"
echo "Line 2">>test_file.txt 
git add test_file.txt 
git commit -m"Meant for it to be two lines"
git checkout -b dev
echo Meaningful code>new_file.txt
git add new_file.txt 
git commit -m"Meaningful commit"
git checkout master
echo Conflicting meaningful code>new_file.txt
git add new_file.txt 
git commit -m"Conflicting meaningful commit"
# This will conflict
git merge dev
# Fixes conflict
echo Merged meaningful code>new_file.txt
git add new_file.txt
git commit -m"Merged dev with master"
cd ..

#========================================================
# Save off a clone of the repository prior to squashing
#========================================================
git clone test_squash test_squash_clone
#========================================================

#========================================================
# Do the squash
#========================================================
cd test_squash
GIT_EDITOR=../test_squash_helper.sh git rebase -i HEAD@{7}
#========================================================

#========================================================
# Show the results
#========================================================
git log
git gc
git reflog
#========================================================

test_squash_helper.sh (ใช้โดย test_sqash.sh):

# If the file has the phrase "pick " in it, assume it's the log file
if grep -q "pick " $1
then
  sed -e "s/pick \(.*\) \(Meant for it to be two lines\)/squash \1 \2/g" < $1 > $1.tmp
  mv $1.tmp $1
# Else, assume it's the commit message file
else
# Use our pre-canned message
  echo "Created two line file" > $1
fi

PS: ใช่ฉันรู้ว่าคุณบางคนประจบประแจงเมื่อคุณเห็นฉันใช้ emacs เป็นบรรณาธิการถอยกลับ

PPS: เรารู้ว่าเราจะต้องทำลายพื้นที่เก็บข้อมูลที่มีอยู่ทั้งหมดหลังจากการรีบูต (ตามแนว "คุณจะไม่ต้องรีบูทพื้นที่เก็บข้อมูลหลังจากเผยแพร่แล้ว")

PPPS: ทุกคนสามารถบอกวิธีเพิ่มความโปรดปรานให้กับฉันได้ไหม ฉันไม่เห็นตัวเลือกใด ๆ บนหน้าจอนี้ไม่ว่าฉันจะอยู่ในโหมดแก้ไขหรือโหมดดู


มีความเกี่ยวข้องมากกว่าสคริปต์ที่ใช้คือการกระทำที่พยายามครั้งสุดท้าย - มันค่อนข้างแน่ใจว่าเป็นรายการของการเลือกและผสมระหว่างสควอชใช่ไหม? และมีการรวมใด ๆ ที่กระทำในสาขาที่ถูกปฏิเสธ? (แม้ว่าคุณไม่ได้ใช้rebase -pอยู่แล้ว)
Cascabel

ฉันไม่แน่ใจว่าคุณหมายถึงอะไรโดย "การกระทำที่พยายามครั้งสุดท้าย" แต่มันเป็นเพียงรายการของการผสมและการเลือกสควอชที่มี 400 หรือมากกว่านั้นคือการเลือกทั้งหมด ไม่มีการรวมในรายการนั้นแม้ว่าการรีบูตเองกำลังดำเนินการผสานของตัวเอง ตามสิ่งที่ฉันได้อ่านไม่แนะนำให้ใช้ "rebase -p" ด้วยโหมดการโต้ตอบ (ซึ่งในกรณีของฉันไม่ใช่แบบโต้ตอบทั้งหมดที่แน่นอน) จากkernel.org/pub/software/scm/git/docs/git-rebase.html : "สิ่งนี้ใช้เครื่องจักรอินเทอร์แอกทีฟภายใน แต่การรวมเข้ากับตัวเลือก - อินเตอร์แอคทีฟโดยทั่วไปไม่ใช่ความคิดที่ดี"
เบ็น Hocking

โดย "การกระทำที่พยายามครั้งสุดท้าย" ฉันหมายถึงรายการการเลือก / สควอชที่ส่งกลับไปยังrebase --interactive- นั่นเป็นรายการการกระทำเพื่อให้คอมไพล์พยายาม ฉันหวังว่าคุณจะสามารถลดสิ่งนี้เป็นสควอชเดียวที่ก่อให้เกิดความขัดแย้งและหลีกเลี่ยงความซับซ้อนพิเศษทั้งหมดของสคริปต์ผู้ช่วยของคุณ ข้อมูลที่หายไปอื่น ๆ คือเมื่อความขัดแย้งเกิดขึ้น - เมื่อ git ใช้แพทช์เพื่อสร้างสควอชหรือเมื่อมันพยายามที่จะย้ายสควอชที่ผ่านมาและใช้แพทช์ต่อไป? (และคุณแน่ใจหรือว่าไม่มีอะไรเลวร้ายเกิดขึ้นกับกระบอง GIT_EDITOR ของคุณอีกโหวตสำหรับกรณีทดสอบง่ายๆ)
Cascabel

ขอบคุณสำหรับความคิดเห็นที่เป็นประโยชน์ ฉันได้อัปเดตคำถามเพื่อให้สะท้อนถึงคำตอบของฉัน
Ben Hocking

2
กรณีที่เก็บของเล่นนั้นง่ายต่อการเข้าใจมากกว่าสคริปต์ของคุณ - และแสดงให้เห็นว่าสคริปต์ไม่มีส่วนเกี่ยวข้องกับมันเพียงแค่ข้อเท็จจริงที่ว่าคุณกำลังพยายามที่จะลดสาขาที่มีการผสานกับการแก้ไขข้อขัดแย้ง (การรวมที่ชั่วร้ายอย่างอ่อนโยน) )
Cascabel

คำตอบ:


69

เอาล่ะฉันมั่นใจพอที่จะตอบคำถามได้ อาจจะต้องแก้ไข แต่ฉันเชื่อว่าฉันรู้ว่าปัญหาของคุณคืออะไร

กรณีทดสอบของเล่น repo ของคุณมีการรวมเข้าด้วยกัน - แย่กว่านั้นมีการรวมกับความขัดแย้ง และคุณกำลังรีบูตระหว่างการผสาน หากไม่มี-p(ซึ่งใช้งานไม่ได้ทั้งหมด-i) การรวมจะถูกละเว้น ซึ่งหมายความว่าสิ่งที่คุณทำในการแก้ไขข้อขัดแย้งของคุณไม่ได้อยู่ที่นั่นเมื่อ rebase พยายามที่จะเลือกการกระทำต่อไปดังนั้นการแก้ไขอาจไม่สามารถใช้ได้ (ฉันเชื่อว่าสิ่งนี้แสดงให้เห็นว่าเป็นความขัดแย้งในการผสานเพราะgit cherry-pickสามารถใช้ปะแก้ได้โดยทำการผสานสามทางระหว่างการกระทำดั้งเดิมการกระทำปัจจุบันและบรรพบุรุษร่วมกัน)

น่าเสียดายที่เราสังเกตเห็นในความคิดเห็น-iและ-p(รักษาการรวมกัน) ไม่ค่อยเข้ากัน ฉันรู้ว่าการแก้ไข / การเขียนซ้ำทำงานและการเรียงลำดับใหม่ไม่ได้ อย่างไรก็ตามฉันเชื่อว่ามันใช้งานได้ดีกับสควอช นี่ไม่ใช่เอกสาร แต่มันใช้ได้กับกรณีทดสอบที่ฉันอธิบายด้านล่าง หากกรณีของคุณเป็นวิธีที่ซับซ้อนมากขึ้นคุณอาจมีปัญหาในการทำสิ่งที่คุณต้องการแม้ว่ามันจะยังคงเป็นไปได้ (คุณธรรมของเรื่องราว: ทำความสะอาดrebase -i ก่อนที่จะรวม)

ดังนั้นสมมติว่าเรามีกรณีง่าย ๆ ที่เราต้องการรวมกัน A, B และ C:

- o - A - B - C - X - D - E - F (master)
   \             /
    Z -----------

ตอนนี้อย่างที่ฉันพูดถ้าไม่มีความขัดแย้งใน X git rebase -i -pทำงานตามที่คุณคาดหวัง

หากมีความขัดแย้งสิ่งต่าง ๆ ก็จะยิ่งยากขึ้น มันจะทำการบีบอัดที่ดี แต่เมื่อพยายามสร้างการรวมใหม่ความขัดแย้งจะเกิดขึ้นอีกครั้ง คุณจะต้องแก้ไขปัญหาเหล่านั้นอีกครั้งเพิ่มลงในดัชนีจากนั้นใช้git rebase --continueเพื่อดำเนินการต่อ (แน่นอนคุณสามารถแก้ไขได้อีกครั้งโดยการตรวจสอบเวอร์ชั่นจากการผสานดั้งเดิม)

หากคุณเกิดขึ้นจะมีการrerereเปิดใช้งานใน repo ของคุณ ( rerere.enabledตั้งค่าเป็น TRUE) นี้จะเป็นวิธีที่ง่าย - คอมไพล์จะสามารถreใช้ใหม่แบบมีสายใหม่แก้ปัญหาจากเมื่อคุณ แต่เดิมมีความขัดแย้งและสิ่งที่คุณต้องทำคือการตรวจสอบได้ เพื่อให้แน่ใจว่าทำงานได้ถูกต้องเพิ่มไฟล์ลงในดัชนีและดำเนินการต่อ (คุณสามารถไปได้ไกลขึ้นหนึ่งก้าวเปิดrerere.autoupdateเครื่องและมันจะเพิ่มให้คุณดังนั้นการรวมจะไม่ล้มเหลว) อย่างไรก็ตามฉันคาดเดาว่าคุณไม่ได้เปิดใช้งานอีกครั้งดังนั้นคุณจะต้องแก้ไขข้อขัดแย้งด้วยตัวเอง *

* หรือคุณสามารถลองใช้rerere-train.shสคริปต์จาก git-contrib ซึ่งพยายามที่จะ "Prime [the] rerere ฐานข้อมูลจากการคอมมิชชันเดิม" - โดยทั่วไปมันจะตรวจสอบการคอมมิชชันที่คอมมิททั้งหมดพยายามที่จะรวมมันเข้าด้วยกัน git-rerereคว้ามันและการแสดงผลให้พวกเขาไป อาจใช้เวลานานและฉันไม่เคยใช้จริง ๆ แต่อาจมีประโยชน์มาก


ป.ล. มองย้อนกลับไปที่ความคิดเห็นของฉันฉันเห็นว่าฉันควรจะจับมันได้เร็วกว่านี้ ฉันถามว่าคุณกำลังรีบูทสาขาที่มีการรวมหรือไม่และคุณบอกว่าไม่มีการรวมในรายการรีบูตแบบโต้ตอบซึ่งไม่ใช่สิ่งเดียวกัน - ไม่มีการรวมที่นั่นเพราะคุณไม่ได้จัดหา-pตัวเลือก
Cascabel

แน่นอนฉันจะให้มันไป ตั้งแต่โพสต์สิ่งนี้ฉันก็สังเกตเห็นในบางกรณีฉันสามารถพิมพ์ได้git commit -a -m"Some message"และgit rebase --continueและจะดำเนินการต่อไป ใช้งานได้แม้ไม่มี-pตัวเลือก แต่ใช้งานได้ดีกว่ากับ-pตัวเลือก (เนื่องจากฉันไม่ได้ทำการสั่งซื้อซ้ำอีกครั้งดูเหมือนว่า-pไม่เป็นไร) อย่างไรก็ตามฉันจะแจ้งให้คุณทราบ
Ben Hocking

การตั้งค่าgit config --global rerere.enabled trueและgit config --global rerere.autoupdate trueก่อนใช้งานตัวอย่างทดสอบจะช่วยแก้ไขปัญหาหลัก ที่น่าสนใจพอ --preserve-mergesแต่ก็ไม่ได้รักษาผสานแม้เมื่อระบุ อย่างไรก็ตามหากฉันไม่ได้ตั้งค่าเหล่านั้นและฉันพิมพ์git commit -a -m"Meaningful commit"และgit rebase --continueในขณะระบุ--preserve-mergesก็จะรักษาการรวม อย่างไรก็ตามขอขอบคุณที่ช่วยฉันแก้ไขปัญหานี้!
Ben Hocking

84

หากคุณไม่สนใจที่จะสร้างสาขาใหม่นี่คือวิธีที่ฉันจัดการกับปัญหา:

เป็นหลัก:

# create a new branch
git checkout -b new_clean_branch

# apply all changes
git merge original_messy_branch

# forget the commits but have the changes staged for commit
git reset --soft main        

git commit -m "Squashed changes from original_messy_branch"

3
วิธีแก้ปัญหาที่เร็วและมีประสิทธิภาพที่สุด :)
IslamTaha

2
นี่เป็นคำแนะนำที่ยอดเยี่ยม! ทำงานได้ดีมากสำหรับการรวมหลายคอมมิท
philidem

3
นี่เป็นทางออกที่ปลอดภัยกว่า ฉันยังได้เพิ่ม - รวมถึงการรวม กำลัง: git merge --squash original_messy_branch
jezpez

1
ขอบคุณที่ช่วยกันประหยัดทั้งวันและชีวิตของฉัน :) ทางออกที่ดีที่สุดที่ทุกคนจะได้รับ

เมื่อใดที่คุณgit diff new_clean_branch..original_messy_branchควรเป็นเหมือนกัน สำหรับฉันพวกเขาแตกต่างกัน
LeonardChallis

5

ฉันกำลังมองหาความต้องการที่คล้ายกันนั่นคือการยกเลิกการแทรกแซงของสาขาการพัฒนาของฉันฉันพบว่ากระบวนการนี้เหมาะสำหรับฉัน
ในสาขาที่ทำงานของฉัน

git reset –hard mybranch-start-commit
git checkout mybranch-end-commit . // files only of the latest commit
git add -a
git commit -m”New Message intermediate commits discarded”

วิโอล่าเราได้ทำการเชื่อมต่อคอมมิชชันล่าสุดกับการคอมมิชชันเริ่มต้นของสาขา! ไม่มีปัญหาความขัดแย้งผสาน! ในการฝึกการเรียนรู้ของฉันฉันมาถึงข้อสรุปนี้ในขั้นตอนนี้มีวิธีที่ดีกว่าสำหรับวัตถุประสงค์


FYI - ฉันเพิ่งลองทำสิ่งนี้และพบว่าการชำระเงินของ mybranch-end-commit ไม่ได้ทำให้ฉันได้รับการลบที่เกิดขึ้นในระดับกลาง ดังนั้นจึงตรวจสอบไฟล์ที่มีอยู่ใน mybranch-end-commit
ahains

1

การสร้างคำตอบที่ยอดเยี่ยมของ@ hlidkaด้านบนซึ่งลดการแทรกแซงด้วยตนเองลงฉันต้องการเพิ่มเวอร์ชันที่เก็บรักษาคอมมิทใหม่ที่ไม่ได้อยู่ในสควอช

เนื่องจากฉันเชื่อว่าสิ่งเหล่านี้อาจสูญหายได้ง่ายในgit resetขั้นตอนในตัวอย่างนั้น

# create a new branch 
# ...from the commit in master original_messy_branch was originally based on. eg 5654da06
git checkout -b new_clean_branch 5654da06

# apply all changes
git merge original_messy_branch

# forget the commits but have the changes staged for commit
# ...base the reset on the base commit from Master
git reset --soft 5654da06       

git commit -m "Squashed changes from original_messy_branch"

# Rebase onto HEAD of master
git rebase origin/master

# Resolve any new conflicts from the new commits

0

โปรดทราบว่า-Xและตัวเลือกกลยุทธ์ถูกละเว้นเมื่อใช้ในการรีบูตแบบโต้ตอบ

ดูการกระทำ db2b3b820e2b28da268cc88adff076b396392dfe (กรกฎาคม 2013, คอมไพล์ 1.8.4+),

อย่าเพิกเฉยตัวเลือกการผสานในการรีบูตแบบโต้ตอบ

กลยุทธ์การผสานและตัวเลือกที่สามารถจะระบุไว้ในgit rebaseแต่มี-- interactiveพวกเขาถูกละเว้นสมบูรณ์

ลงชื่อออกโดย: Arnaud Fontaine

-Xตอนนี้หมายถึงและกลยุทธ์ทำงานร่วมกับการรีบูตแบบโต้ตอบเช่นเดียวกับการรีบูตธรรมดาและสคริปต์เริ่มต้นของคุณสามารถทำงานได้ดีขึ้น


0

ฉันพบปัญหาที่เรียบง่าย แต่คล้ายกันซึ่งฉันมี 1) แก้ไขข้อขัดแย้งการรวมในสาขาท้องถิ่น 2) ทำงานต่อไปเพิ่มจำนวนการกระทำที่น้อยลง 3) ต้องการที่จะลดและรวมความขัดแย้ง

สำหรับฉันgit rebase -p -i masterทำงาน มันทำให้การแก้ไขข้อขัดแย้งเดิมยังคงอยู่และทำให้ฉันสควอชคนอื่นอยู่ด้านบน

หวังว่าจะช่วยใครบางคน!


ฉันยังคงมีข้อขัดแย้งเล็กน้อยในการแก้ไขด้วยตนเองเมื่อพยายามรีสตาร์ตด้วย -p เป็นที่ยอมรับว่ามีความขัดแย้งน้อยลงและพวกเขา จำกัด ไฟล์โครงการไว้มากกว่าไฟล์รหัสทั้งหมดที่ฉันเคยขัดแย้งมาก่อน เห็นได้ชัดว่า "ผสานการแก้ไขข้อขัดแย้งหรือการแก้ไขด้วยตนเองเพื่อรวมการกระทำที่ไม่ได้รับการรักษาไว้" - stackoverflow.com/a/35714301/727345
JonoB
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.