ฉันจะส่งการแก้ไขที่คอมมิตไปยังที่เก็บ Git ระยะไกลได้อย่างไร?


662

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

> git commit --amend

น่าเสียดายที่ความมุ่งมั่นไม่สามารถผลักดันกลับไปที่ที่เก็บ มันถูกปฏิเสธเช่นนี้:

> git push origin
To //my.remote.repo.com/stuff.git/
 ! [rejected]        master -> master (non-fast forward)
error: failed to push some refs to '//my.remote.repo.com/stuff.git/'

ฉันควรทำอย่างไรดี? (ฉันสามารถเข้าถึงที่เก็บข้อมูลระยะไกลได้)


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

7
@faB: ฉันคิดว่านั่นเป็นคำถามที่พบบ่อย ข้อความคอมมิชชันถูกแฮชพร้อมกับคอมมิชชันดังนั้น chaning จะเปลี่ยน revid (แฮช) หากยังไม่ชัดเจน: ไม่สามารถทำได้ IIRC สามารถจัดเก็บข้อมูลนอกวงในบันทึกย่อ (เพื่อให้คุณสามารถเพิ่มความคิดเห็นที่มีอยู่ได้โดยไม่ต้องเปลี่ยนแปลง) หากต้องการกำหนดป้ายกำกับเฉพาะให้ใช้แท็ก
sehe

1
คุณจะเร็ว ๆ นี้ (git1.8.5, Q4 2013) จะสามารถที่จะทำgit push -forceอย่างระมัดระวังมากขึ้น
VonC

3
นี่คือสไตล์คาวบอย อย่าเรียนรู้เพิ่มเติมหรืออย่าตามหาวิธีที่จะเลิกทำการแก้ไขคอมไพล์ก่อนหน้า เพียงแค่เพิ่มรหัสตัวยึดบางตัวฉันหมายถึงเพิ่มความคิดเห็นล้างข้อมูลโค้ดเล็กน้อยหรือเพิ่ม dash dash dash เพียงเล็กน้อยตอนนี้ให้คอมมิทจริง ๆ แล้วผลักมันไปที่รีโมต เสร็จแล้ว!
nehem

@ user58777 หาก -amend ของคุณเป็นเพียงการเปลี่ยนข้อความการส่งและคุณยังไม่ได้ทำการส่งข้อความเพิ่มเติมใด ๆ ในพื้นที่ตั้งแต่นั้นมาคุณสามารถรีเซ็ตสาขาในเครื่องของคุณเป็นรีโมตการส่งข้อความระยะไกลที่คุณผลักดันก่อนแก้ไขข้อความยืนยัน
Scott Ahten

คำตอบ:


504

ที่จริงผมผลักครั้งกับ--forceและ.gitพื้นที่เก็บข้อมูลและได้ดุ Linus BIG TIME โดยทั่วไปสิ่งนี้จะสร้างปัญหามากมายให้กับคนอื่น คำตอบง่ายๆคือ "ไม่ต้องทำ"

ฉันเห็นคนอื่นให้สูตรในการทำเช่นนั้นดังนั้นฉันจะไม่ทำซ้ำที่นี่ แต่นี่คือเคล็ดลับในการกู้คืนจากสถานการณ์หลังจากที่คุณได้ผลักดันการกระทำที่แก้ไขเพิ่มเติมด้วย --force (หรือ + ต้นแบบ)

  1. ใช้git reflogเพื่อค้นหาการคอมมิชชันเก่าที่คุณแก้ไข (เรียกว่าoldและเราจะเรียกคอมมิทใหม่ที่คุณสร้างขึ้นโดยการแก้ไขnew)
  2. สร้างการผสานระหว่างoldและnewบันทึกต้นไม้ของเช่นnewgit checkout new && git merge -s ours old
  3. ผสานสิ่งนั้นเข้ากับเจ้านายของคุณด้วย git merge master
  4. อัปเดตต้นแบบของคุณด้วยผลลัพธ์ด้วย git push . HEAD:master
  5. ผลักผลลัพธ์ออกมา

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


17
ฉันรู้ดีว่าจะเกิดอะไรขึ้นเมื่อคุณบังคับให้ส่งการแก้ไข (โดยการทำลายประวัติศาสตร์) โชคดีที่ฉันเป็นผู้พัฒนาโครงการเดียวที่มี repo ระยะไกลอยู่ในไดรฟ์เครือข่ายดังนั้นจึงไม่ใช่เรื่องใหญ่ ฉันไม่เคยคิดที่จะรวมความมุ่งมั่นในการแก้ไขดังนั้นฉันจะลบล้างสิ่งนี้
Spoike

61
ใน บริษัท ของเราเรามีการผลักดันอย่างสม่ำเสมอ ... ในสาขาที่พัฒนาโดยบุคคล
Ondra Žižka

2
การดุจาก Linus เป็นเพราะคุณลบประวัติด้วยตัวเลือกการบังคับไม่ใช่เพราะคุณไม่ควรทำ โซลูชันของ GabrielleV ทำงานได้ดีเพราะไม่เปลี่ยนประวัติ
user411279

2
ได้โปรดเนื่องจากผู้เขียน (gitster) ของคำตอบนี้ดูเหมือนว่าจะไม่มีอีกต่อไปใครสามารถช่วยในการชี้แจงหมายเลขรายการ 1: ค้นหาการกระทำที่เก่า หากคุณไม่มีข้อมูลสำรองคุณจะพบที่ไหน แก้ไขและบังคับให้กดจะไม่ทำลายหรือไม่ บางทีเขาอาจหมายถึงการเอามันมาจากเพื่อน / ผู้ทำงานร่วมกันที่ยังมีมันอยู่ในต้นไม้?
ดร. Beco

2
ดร. Breco คุณสามารถใช้git reflogหามันได้
Simon Zyx

269

คุณเห็นคุณลักษณะความปลอดภัยของ Git Git ปฏิเสธที่จะอัปเดตสาขาระยะไกลด้วยสาขาของคุณเนื่องจากการกระทำที่หัวหน้าสาขาของคุณไม่ได้เป็นผู้สืบทอดโดยตรงของการกระทำที่หัวหน้าปัจจุบันของสาขาที่คุณกำลังผลักดัน

หากไม่ใช่กรณีนี้คนสองคนที่ผลักดันไปยังแหล่งเก็บข้อมูลเดียวกันในเวลาเดียวกันจะไม่ทราบว่ามีการกระทำใหม่เข้ามาในเวลาเดียวกัน พวกเขาตระหนักถึงสิ่งนี้

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

git push -f origin master

แม้เรื่องนี้อาจไม่ทำงานตาม Git ช่วยให้เก็บระยะไกลที่จะปฏิเสธการผลักดันไม่ใช่ fastforward receive.denynonfastforwardsที่ปลายสุดโดยใช้ตัวแปรการกำหนดค่า หากเป็นกรณีนี้เหตุผลการปฏิเสธจะมีลักษณะเช่นนี้ (โปรดสังเกตส่วน 'การปฏิเสธระยะไกล'):

 ! [remote rejected] master -> master (non-fast forward)

ในการหลีกเลี่ยงปัญหานี้คุณต้องเปลี่ยนการกำหนดค่าของที่เก็บระยะไกลหรือแฮ็คสกปรกคุณสามารถลบและสร้างสาขาใหม่ได้:

git push origin :master
git push origin master

โดยทั่วไปพารามิเตอร์สุดท้ายที่จะgit pushใช้รูปแบบ<local_ref>:<remote_ref>โดยที่local_refชื่อของสาขาบนที่เก็บท้องถิ่นและremote_refเป็นชื่อของสาขาในพื้นที่เก็บข้อมูลระยะไกล คู่คำสั่งนี้ใช้ชวเลขสองตัว :masterมี null local_ref ซึ่งหมายถึงผลักสาขาเป็นโมฆะไปยังด้านระยะไกลmasterคือลบสาขาระยะไกล ชื่อสาขาที่ไม่มี:วิธีผลักสาขาท้องถิ่นด้วยชื่อที่กำหนดไปยังสาขาระยะไกลที่มีชื่อเดียวกัน ในสถานการณ์เช่นนี้สั้นสำหรับmastermaster:master


2
นี้ไม่ได้ทำงานร่วมกับ GitHub มันทำให้ฉันข้อความต่อไปนี้: [ปฏิเสธระยะไกล] ต้นแบบ (ลบสาขาปัจจุบันต้องห้าม)
vedang

ฉันไม่ต้องการบังคับให้ถูกผลัก (ซึ่งฉันรู้ว่าจะแก้ปัญหาได้) แต่ตอนนี้ฉันเดาว่าฉันไม่มีทางเลือก
vedang

1
นี่เป็นทางออกเดียวที่ทำงานสำหรับ repo ของฉันเป็นเจ้าภาพด้วย Assembla
Justin

1
การลบสาขาต้นแบบระยะไกลจะเพิ่มพื้นที่ว่างใน repo ระยะไกลหรือไม่
Mr_and_Mrs_D

1
@Mr_and_Mrs_D: ไม่ทันที แต่หลังจากgit gcการ reflogs ที่หมดอายุแล้ววัตถุเก่าจะถูกตัด ไม่มีใครที่โคลนที่เก็บข้อมูลจะได้รับวัตถุใด ๆ ที่ไม่สามารถเข้าถึงได้อีกต่อไปทันทีที่สาขาได้รับการปรับปรุง
CB Bailey

211

พูดจาโผงผางอย่างรวดเร็ว: ความจริงที่ว่าไม่มีใครโพสต์คำตอบง่ายๆที่นี่แสดงให้เห็นถึงความเป็นศัตรูของผู้ใช้ที่แสดงโดย Git CLI

อย่างไรก็ตามวิธีที่ "ชัดเจน" ในการทำเช่นนี้หากคุณยังไม่ได้พยายามบังคับให้ทำ สิ่งนี้จะดึงการเปลี่ยนแปลงที่คุณแก้ไข (และไม่มีอีกต่อไป) เพื่อให้คุณได้รับมันอีกครั้ง

เมื่อคุณแก้ไขข้อขัดแย้งแล้วคุณสามารถผลักดันอีกครั้ง

ดังนั้น:

git pull

หากคุณพบข้อผิดพลาดในการดึงอาจมีบางอย่างผิดปกติในการกำหนดค่าที่เก็บในเครื่องของคุณ (ฉันมีการอ้างอิงผิดในส่วน. git / config)

และหลังจากนั้น

git push

บางทีคุณอาจจะได้รับความรับผิดชอบเพิ่มเติมกับผู้บอกเรื่องเกี่ยวกับ "รวมเล็กน้อย"


2
ใช่ฉันเขียนเกี่ยวกับเรื่องนี้ดูstackoverflow.com/questions/253055/ … ;)
Spoike

10
มันใช้งานไม่ได้เหมือนที่ฉันคาดไว้ มันสร้างสองกระทำใหม่ หนึ่งที่เป็นแบบจำลองของเก่า แต่ด้วยการเปลี่ยนแปลงแก้ไข และหนึ่งผสานกระทำด้วยความต่างที่ว่างเปล่า ยังคงทิ้งความมุ่งมั่นเก่าไว้ไม่เปลี่ยนแปลงเผยให้เห็นข้อมูลที่ละเอียดอ่อนที่ฉันพยายามแก้ไข ฉันเชื่อgit push -fหรือgit resetเป็นวิธีเดียวที่จะไปที่นี่
thnee

40
ในขณะที่ตอบปัญหาทางเทคนิคก็ไม่ได้แก้ไขปัญหา ดังที่คุณกล่าวว่ามันจะสร้างความมุ่งมั่นเพิ่มขึ้น แต่เหตุผลหลักที่ผู้คนแก้ไขความมุ่งมั่นคือการหลีกเลี่ยงการสร้างสิ่งใหม่ ดังนั้นหากผู้โพสต์ต้องทำตามคำแนะนำของคุณเขาจะไม่ได้ผลลัพธ์ตามที่ต้องการ มันจะสมเหตุสมผลเช่นเดียวกับการไม่แก้ไขความมุ่งมั่นตั้งแต่แรก
Dan Jones

102

คำตอบสั้น ๆ : อย่าผลักดันให้คำมั่นสัญญาฉบับแก้ไขสาธารณะ

คำตอบยาว: คำสั่ง Git สองสามอันเช่นgit commit --amendและgit rebaseเขียนกราฟประวัติศาสตร์อีกครั้ง นี่เป็นเรื่องปกติตราบใดที่คุณยังไม่ได้เผยแพร่การเปลี่ยนแปลงของคุณ แต่เมื่อคุณทำแล้วคุณไม่ควรล้อเล่นกับประวัติศาสตร์เพราะถ้ามีคนได้รับการเปลี่ยนแปลงของคุณแล้วเมื่อพวกเขาพยายามที่จะดึงอีกครั้งมันอาจล้มเหลว . แทนที่จะแก้ไขข้อผูกมัดคุณควรสร้างคอมมิชชันใหม่ด้วยการเปลี่ยนแปลง

อย่างไรก็ตามหากคุณต้องการผลักดันการแก้ไขคุณสามารถทำได้ดังนี้:

$ git push origin +master:master

+สัญญาณชั้นนำจะบังคับให้เกิดการผลักดันแม้ว่ามันจะไม่ส่งผลให้เกิด "การกรอไปข้างหน้า" ก็ตาม (การส่งต่อที่รวดเร็วเกิดขึ้นเมื่อการเปลี่ยนแปลงที่คุณกดเป็นผู้สืบทอดโดยตรงของการเปลี่ยนแปลงที่มีอยู่แล้วใน repo สาธารณะ)


5
สิ่งนี้แตกต่างกัน (ดีกว่าหรือแย่กว่า) กว่า git push -f อย่างไร ขอบคุณ!
bentford

11
@bentford: git push -fมันเป็นพื้นเดียวกับ
mipadi

54

นี่เป็นวิธีที่ง่ายและสะอาดในการผลักดันการเปลี่ยนแปลงของคุณหลังจากคุณได้ทำสิ่งต่อไปนี้แล้วcommit --amend:

git reset --soft HEAD^
git stash
git push -f origin master
git stash pop
git commit -a
git push origin master

ซึ่งทำสิ่งต่อไปนี้:

  • รีเซ็ตหัวหน้าสาขาเป็นกระทำแม่
  • สะสมความมุ่งมั่นล่าสุดนี้
  • บังคับให้กดไปที่รีโมท รีโมตในตอนนี้ยังไม่มีคอมมิทล่าสุด
  • ป๊อปสะสมของคุณ
  • มุ่งมั่นอย่างหมดจด
  • กดไปที่รีโมท

จำไว้ว่าให้เปลี่ยน "จุดเริ่มต้น" และ "หลัก" หากใช้กับสาขาหรือรีโมตอื่น


3
2 ข้อสังเกต: - ตรวจสอบให้แน่ใจว่าได้เปลี่ยนชื่อของสาขาถ้าคุณกำลังทำงานในอีก - ฉันต้องใช้git addก่อนที่จะกระทำการรวมการเปลี่ยนแปลง
SylvainB

1
ใน Windows CMD, git reset --soft "HEAD^"คำสั่งแรกควรจะหนี: ส่วนที่เหลือทำงานได้ดี
MrMister

2
"เป็นวิธีที่ง่ายและสะอาด .. " cit ขั้นตอนนี้รวมถึงการบังคับให้ออกแรง ในแสงของ critisims ทั้งหมดใน Answers ข้างต้นฉันไม่แน่ใจว่าในความเป็นจริงขั้นตอนนี้สะอาดหรือไม่
Na13-c

24

ฉันได้แก้ไขแล้วโดยทิ้งการแก้ไขข้อผูกพันและเพิ่มการเปลี่ยนแปลงใหม่ด้านบน:

# Rewind to commit before conflicting
git reset --soft HEAD~1

# Pull the remote version
git pull

# Add the new commit on top
git add ...
git commit
git push

2
นี่เป็นเวอร์ชั่นที่ง่ายที่สุด!
mknaf

การเพิ่มการเปลี่ยนแปลงที่กระทำจะเป็นการดีกว่าการเขียนประวัติการเขียนใหม่ ฉันเห็นด้วยกับ @mknaf
sdkks

8

ผมมีปัญหาเดียวกัน.

  • แก้ไขการกระทำครั้งสุดท้ายที่ผลักไปแล้วโดยไม่ได้ตั้งใจ
  • เสร็จสิ้นการเปลี่ยนแปลงจำนวนมากในพื้นที่มุ่งมั่นห้าครั้ง
  • พยายามที่จะผลักดัน, มีข้อผิดพลาด, ตื่นตระหนก, รวมระยะไกล, มีไฟล์จำนวนมากที่ไม่ใช่ของฉัน, ผลัก, ล้มเหลว ฯลฯ

ในฐานะที่เป็น Git-มือใหม่ผมคิดว่ามันเป็นที่สมบูรณ์FUBAR

การแก้ไข: ค่อนข้างเหมือน @bara แนะนำ + สร้างสาขาสำรองในท้องถิ่น

# Rewind to commit just before the pushed-and-amended one.
# Replace <hash> with the needed hash.
# --soft means: leave all the changes there, so nothing is lost.
git reset --soft <hash>

# Create new branch, just for a backup, still having all changes in it.
# The branch was feature/1234, new one - feature/1234-gone-bad
git checkout -b feature/1234-gone-bad

# Commit all the changes (all the mess) not to lose it & not to carry around
git commit -a -m "feature/1234 backup"

# Switch back to the original branch
git checkout feature/1234

# Pull the from remote (named 'origin'), thus 'repairing' our main problem
git pull origin/feature/1234

# Now you have a clean-and-non-diverged branch and a backup of the local changes.
# Check the needed files from the backup branch
git checkout feature/1234-gone-bad -- the/path/to/file.php

อาจไม่ใช่วิธีที่รวดเร็วและสะอาดและฉันสูญเสียประวัติของฉัน (1 คอมมิทแทนที่จะเป็น 5) แต่มันบันทึกงานประจำวันได้


6

หากคุณยังไม่ได้ส่งรหัสไปยังสาขาระยะไกลของคุณ (GitHub / Bitbucket) คุณสามารถเปลี่ยนข้อความยืนยันในบรรทัดคำสั่งดังต่อไปนี้

 git commit --amend -m "Your new message"

หากคุณกำลังทำงานในสาขาที่เฉพาะเจาะจงทำสิ่งนี้:

git commit --amend -m "BRANCH-NAME: new message"

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

โปรดอ่านคำตอบทั้งหมดก่อนที่จะทำ

git commit --amend -m "BRANCH-NAME : your new message"

git push -f origin BRANCH-NAME                # Not a best practice. Read below why?

โน๊ตสำคัญ:เมื่อคุณใช้แรงกดโดยตรงคุณอาจพบปัญหารหัสที่นักพัฒนารายอื่นกำลังทำงานในสาขาเดียวกัน ดังนั้นเพื่อหลีกเลี่ยงความขัดแย้งเหล่านั้นคุณจำเป็นต้องดึงรหัสจากสาขาของคุณก่อนที่จะทำการกดบังคับ :

 git commit --amend -m "BRANCH-NAME : your new message"
 git pull origin BRANCH-NAME
 git push -f origin BRANCH-NAME

นี่เป็นแนวทางปฏิบัติที่ดีที่สุดเมื่อเปลี่ยนข้อความการส่งข้อความหากได้รับการพุชแล้ว


1
หากคุณดึงความมุ่งมั่นกลับมาในตัวอย่างสุดท้ายได้สำเร็จทำไมคุณต้องบังคับให้กด? การดันแบบมาตรฐานจะไม่เพียงพอหรือไม่ ขอบคุณ
โทมัส

คำถามที่ถามโดย Thomas นั้นจริงแล้วถูกต้องมาก ตัวฉันเองไม่จำเป็นต้องฝืนกดแรง ๆ
Na13-c

โปรดอย่าเรียกมันว่า "วิธีปฏิบัติที่ดีที่สุด" เพราะมีวิธีการแก้ปัญหา--forceให้ดูคำตอบที่ยอมรับ
Farid

5

หากคุณรู้ว่าไม่มีใครดึงข้อผูกพันที่ไม่ได้แก้ไขให้ใช้--force-with-leaseตัวเลือกของgit pushตัวเลือกในการ

ใน TortoiseGit คุณสามารถทำสิ่งเดียวกันภายใต้ตัวเลือก "Push ... " "Force: May ทิ้ง" และตรวจสอบ "การเปลี่ยนแปลงที่รู้จัก"

บังคับใช้ (อาจยกเลิกการเปลี่ยนแปลงที่ทราบ)อนุญาตให้ที่เก็บระยะไกลยอมรับการผลักดันที่ไม่ใช่ไปข้างหน้าอย่างปลอดภัย สิ่งนี้สามารถทำให้ที่เก็บข้อมูลรีโมตสูญเสียการคอมมิท ใช้ด้วยความระมัดระวัง วิธีนี้สามารถป้องกันไม่ให้สูญเสียการเปลี่ยนแปลงที่ไม่รู้จักจากบุคคลอื่นในระยะไกล จะตรวจสอบว่าเซิร์ฟเวอร์สาขาชี้ไปที่การกระทำเดียวกันกับสาขาการติดตามระยะไกล (การเปลี่ยนแปลงที่รู้จัก) หากใช่จะมีการกดปุ่มบังคับ มิฉะนั้นจะถูกปฏิเสธ เนื่องจาก git ไม่มีแท็กติดตามระยะไกลจึงไม่สามารถเขียนทับแท็กได้โดยใช้ตัวเลือกนี้


4

คุณได้รับข้อผิดพลาดนี้เนื่องจากรีโมต Git มีไฟล์คอมมิทเหล่านี้อยู่แล้ว คุณต้องบังคับผลักดันให้สาขานี้ทำงาน:

git push -f origin branch_name

ตรวจสอบให้แน่ใจว่าคุณดึงรหัสจากระยะไกลเนื่องจากมีคนอื่นในทีมของคุณอาจผลักไปที่สาขาเดียวกัน

git pull origin branch_name

นี่เป็นหนึ่งในกรณีที่เราต้องบังคับให้ส่งการกระทำไปที่รีโมต


เหตุใดคำตอบนี้จึงไม่ใช่คำตอบที่เป็นความคิดเห็นที่สำคัญในคำตอบก่อนหน้า
Na13-c

2

นี่เป็นวิธีที่ง่ายและสะอาดในการผลักดันการเปลี่ยนแปลงของคุณหลังจากที่คุณทำแล้วgit add "your files"และgit commit --amend:

git push origin master -f

หรือ:

git push origin master --force

ฉันได้ยินว่าไม่ดีและฉันแน่ใจว่ามันเป็น มีเหตุผล (ดี) สำหรับ git ที่จะล้มเหลวโดยค่าเริ่มต้น (และต้องการ --force) ฉันแน่ใจ
Rolf

1

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


ไม่ได้จริงๆ ปัญหาอาจเกิดจากคุณยังไม่ได้อัปเดตสำเนาในเครื่องของคุณจาก repo ระยะไกล Git จะไม่ผลักดันมันเนื่องจากคุณอาจต้องจัดการกับการรวมด้วยตนเอง ในการตอบกลับอื่น ๆ ของฉันฉันมีคำสั่ง (และคำอธิบาย) ที่จะบังคับให้กด - แต่ระวังว่าอาจลบการเปลี่ยนแปลงในระยะไกล
mipadi

1

ฉันแค่ทำในสิ่งที่ Git บอกให้ฉันทำต่อไป ดังนั้น:

  • ไม่สามารถผลักดันเนื่องจากความมุ่งมั่นที่แก้ไขเพิ่มเติม
  • ฉันทำตามที่แนะนำ
  • การผสานล้มเหลว ดังนั้นฉันจะแก้ไขด้วยตนเอง
  • สร้างคอมมิทใหม่ (ทำเครื่องหมายว่า "ผสาน") แล้วกด
  • ดูเหมือนว่าจะทำงาน!

หมายเหตุ: การคอมมิชชันที่แก้ไขเพิ่มเติมเป็นอันล่าสุด


1
ฉันจะลงคะแนนถ้าฉันมีคะแนนชื่อเสียงมากขึ้นดังนั้นฉันจะถามที่นี่อย่างสุภาพว่าคุณคือใครของผู้ประสบภัย? คนที่แก้ไขเพิ่มเติม? คนที่ดึงและทำงานในสาขาที่มีความมุ่งมั่นแก้ไขเพิ่มเติม? ก่อนที่จะแก้ไขหรือหลังจากนั้น ฉันเพิ่งล้างการดัดแปลงของฉันทุกครั้งเพราะฉันเข้าใจผิดคุณ ... โชคดีที่มันมีไม่มาก ...
Bartis Áron

1

สิ่งต่อไปนี้ใช้ได้กับฉันเมื่อเปลี่ยนผู้แต่งและผู้มอบหมายสัญญา

git push -f origin master

Git ฉลาดพอที่จะเข้าใจได้ว่าสิ่งเหล่านี้เป็นการกระทำของเดลต้าที่เหมือนกันซึ่งแตกต่างกันในส่วนข้อมูลเมตาเท่านั้น

ทั้งหัวท้องถิ่นและระยะไกลชี้ไปที่ความมุ่งมั่นในคำถาม


1

หากคุณใช้รหัส Visual Studio คุณสามารถลองใช้ส่วนขยายนี้เพื่อให้ง่ายขึ้น

https://marketplace.visualstudio.com/items?itemName=cimdalli.git-commit-amend-push-force

ตามที่คุณสามารถเข้าใจได้จากชื่อมันจะรันคำสั่งอย่างต่อเนื่อง

  • git commit --amend
  • git push --force

0

ที่นี่ฉันจะแก้ไขการกระทำก่อนหน้านี้ได้อย่างไร:

  1. บันทึกงานของคุณจนถึงตอนนี้
  2. หยุดการเปลี่ยนแปลงของคุณในตอนนี้ถ้าทำได้: git stashตอนนี้สำเนาการทำงานของคุณสะอาดในสถานะล่าสุด
  3. ทำการแก้ไขและแก้ไข
  4. ยอมรับการเปลี่ยนแปลงในโหมด"แก้ไข" :git commit --all --amend
  5. เครื่องมือแก้ไขของคุณจะปรากฏขึ้นเพื่อขอข้อความบันทึก (โดยค่าเริ่มต้นคือข้อความบันทึกเก่า) บันทึกและออกจากตัวแก้ไขเมื่อคุณพอใจ

    การเปลี่ยนแปลงใหม่จะถูกเพิ่มเข้ากับการส่งมอบเก่า ดูตัวเองด้วยgit logและgit diff HEAD^

  6. ใช้การเปลี่ยนแปลงที่ถูกเก็บซ้ำของคุณอีกครั้งหากทำ: git stash apply

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.