ทำความสะอาดทางแยกและรีสตาร์ทจากต้นน้ำ


396

ฉันได้แยกพื้นที่เก็บข้อมูลจากนั้นฉันทำการเปลี่ยนแปลงบางอย่างและดูเหมือนว่าฉันทำทุกอย่างยุ่งเหยิง

ฉันต้องการเริ่มต้นใหม่ตั้งแต่ต้นโดยใช้ upstream / master ปัจจุบันเป็นฐานสำหรับการทำงานของฉัน
ฉันควรรีบูทพื้นที่เก็บข้อมูลของฉันหรือลบเลย?


4
คำตอบที่ซับซ้อนมากสำหรับคำถามง่ายๆ เพียงแค่ลบทุกสิ่งและคัดลอกที่เก็บอีกครั้ง
Yaza

1
@Yaza ไม่อาจทำให้คุณมีปัญหามากขึ้นในบางสถานการณ์
Shimmy Weitzhandler

@ shimmy ไม่ใช่ถ้าคุณต้องการที่จะเริ่มต้นใหม่ตั้งแต่เริ่มต้นเช่น OP ถาม
Yaza

คำตอบ:


796

วิธีแก้ปัญหาที่ง่ายที่สุดคือ (ใช้ ' upstream' เป็นชื่อรีโมตที่อ้างอิงถึง repo ดั้งเดิมที่แยกกัน):

git remote add upstream /url/to/original/repo
git fetch upstream
git checkout master
git reset --hard upstream/master  
git push origin master --force 

(คล้ายกับหน้า GitHub นี้ส่วน "ฉันควรทำอย่างไรถ้าฉันอยู่ในสถานการณ์ที่ไม่ดี" )

โปรดระวังว่าคุณอาจสูญเสียการเปลี่ยนแปลงที่ทำกับmasterสาขา (ทั้งในเครื่องเนื่องจากในreset --hardและนอกด้านระยะไกลเนื่องจากpush --force )

ทางเลือกที่จะถ้าคุณต้องการที่จะรักษากระทำของคุณบนเพื่อเล่นกระทำเหล่านั้นอยู่ด้านบนของปัจจุบันmaster แทนที่ส่วนการตั้งค่าโดย จากนั้นคุณยังจะต้องบังคับให้กด ดูเพิ่มเติม " ฉันควรทำอย่างไรถ้าฉันอยู่ในสถานการณ์ที่ไม่ดี "upstream/master
git rebase upstream/master


โซลูชันที่สมบูรณ์มากขึ้นการสำรองข้อมูลงานปัจจุบันของคุณ (ในกรณี) มีรายละเอียดใน " ล้างข้อมูลหลัก git หลักและย้ายการมอบหมายไปยังสาขาใหม่ "

ดูเพิ่มเติม " ดึงการอัปเดตใหม่จากที่เก็บ GitHub ดั้งเดิมลงในที่เก็บ GitHub ที่มีการแยก " เพื่อแสดงว่า " upstream" คืออะไร

ต้นน้ำลำธาร


หมายเหตุ: Repos GitHub ล่าสุดทำปกป้องmasterสาขาpush --forceกับ
ดังนั้นคุณจะต้องยกเลิกการป้องกันmasterครั้งแรก (ดูภาพด้านล่าง) และจากนั้นอีกครั้งหลังจากที่ปกป้องมันแรงผลักดัน )

ป้อนคำอธิบายรูปภาพที่นี่


หมายเหตุ: ใน GitHub โดยเฉพาะขณะนี้ (กุมภาพันธ์ 2019)ทางลัดในการลบ repos ที่มีการแยกสำหรับคำขอการดึงที่ได้รับการรวมเข้ากับอัปสตรีม


4
สวัสดีมันใช้งานได้ดี! btw ไวยากรณ์รีเซ็ตที่ถูกต้องคือgit reset --hard upstream/master
tampe125

1
@ tampe125 ยอดเยี่ยม ฉันได้แก้ไขไวยากรณ์ของgit resetคำตอบแล้ว
VonC

ร้ายแรง: 'upstream' ไม่ปรากฏว่าเป็นที่เก็บคอมไพล์
Benubird

@Benubird ว่าเป็นชื่อของรีโมทอ้างอิง repo เดิม (คนที่คุณง่าม): การดูกราฟและ " git remote" คำสั่งในstackoverflow.com/a/3903835/6309
VonC

ถูกต้อง แต่ยังไม่ชัดเจนจากคำถามของคุณถึงวิธีการตั้งค่าดังกล่าวตามค่าเริ่มต้น 'upstream' ไม่ได้กำหนดไว้ในบรรทัดคำสั่งตามที่ฉันแยกผ่าน github
Benubird

31

คำตอบของความรัก VonC นี่เป็นเวอร์ชั่นง่าย ๆ สำหรับผู้เริ่มต้น

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

ลองเพิ่ม repo ดั้งเดิมลงในส้อมของเราเป็นรีโมท

git remote add original https://git-repo/original/original.git

ตอนนี้เรามาเรียก repo ดั้งเดิมเพื่อให้แน่ใจว่าเรามีรหัสล่าสุด

git fetch original

ในฐานะที่เป็น VonC แนะนำให้ตรวจสอบให้แน่ใจว่าเราอยู่ในต้นแบบ

git checkout master

ตอนนี้เพื่อเพิ่มความเร็วให้กับโค้ดล่าสุดของ repo ดั้งเดิมสิ่งที่เราต้องทำคือรีเซ็ตฮาร์ดสาขาของเราตามรีโมตเดิม

git reset --hard original/master

และคุณทำเสร็จแล้ว :)


2
ฉันกำลังเข้าfatal: ambiguous argument 'original/master': unknown revision or path not in the working tree.สู่ขั้นตอนสุดท้าย คำแนะนำใด ๆ?
TomNorway

ดูเหมือนว่าสิ่งนี้เพิ่งปล่อยให้คุณเก็บไว้ในสาขาระยะไกลเดิม ฉันคิดว่านี่ไม่มีขั้นตอนในการรีเซ็ตส้อมของคุณกลับสู่รีโมตที่ถูกต้องหรือไม่
Ray Suelzer

1
originalดีกว่าupstream(ซึ่งเอกสาร Github ใช้) เช่นเดียวกับorigin/master"อัปสตรีม" ของโลmasterคอล ลดความกำกวม ฉันสงสัยว่านี่คือเหตุผลที่คุณใช้งานหรือไม่
วอน

1
นั่นคือเหตุผลที่ฉันใช้มัน!
Ahmad Awais

2
ฉันทำตามคำแนะนำเหล่านี้และตอนนี้สถานะคอมไพล์พูดว่า: ในสาขาหลักสาขาของคุณและ 'ที่มา / ต้นแบบ' ได้แยกจากกันและมี 52 และ 5 กระทำที่แตกต่างกันตามลำดับ (ใช้ "git pull" เพื่อรวมสาขาจากระยะไกลเข้ากับคุณ) - แต่ฉันต้องการทิ้ง 5 คอมมิชชันของฉัน ขั้นตอนต่อไปคืออะไร?
user3562927

6

ทำตามคำตอบที่ยอดเยี่ยมของ @VonC นโยบาย บริษัท GitHub ของคุณอาจไม่อนุญาตให้ใช้ 'แรงผลักดัน' กับต้นแบบ

remote: error: GH003: Sorry, force-pushing to master is not allowed.

หากคุณได้รับข้อความแสดงข้อผิดพลาดเช่นนี้โปรดลองทำตามขั้นตอนต่อไปนี้

ในการรีเซ็ตส้อมอย่างมีประสิทธิภาพคุณต้องทำตามขั้นตอนเหล่านี้:

git checkout master
git reset --hard upstream/master
git checkout -b tmp_master
git push origin

เปิดส้อมของคุณบน GitHub ใน "การตั้งค่า -> สาขา -> สาขาเริ่มต้น" เลือก 'new_master' เป็นสาขาเริ่มต้นใหม่ ตอนนี้คุณสามารถบังคับให้กด 'สาขา' หลัก:

git checkout master
git push --force origin

จากนั้นคุณจะต้องตั้งค่า 'ต้นแบบ' เป็นสาขาเริ่มต้นในการตั้งค่า GitHub วิธีลบ 'tmp_master':

git push origin --delete tmp_master
git branch -D tmp_master

คำตอบอื่น ๆ คำเตือนเกี่ยวกับการสูญเสียการเปลี่ยนแปลงของคุณยังคงใช้ระวังตัว


4

วิธีการทำ 100% ผ่านGUI ของ Sourcetree

(ไม่ใช่ทุกคนที่ชอบทำสิ่งต่าง ๆ ผ่านส่วนต่อประสานบรรทัดคำสั่ง git)

เมื่อตั้งค่านี้แล้วคุณจะต้องทำตามขั้นตอนที่ 7-13 เท่านั้น

Fetch> checkout master branch> รีเซ็ตเป็น master ของพวกเขา> พุชการเปลี่ยนแปลงไปยังเซิร์ฟเวอร์

ขั้นตอน

  1. ในแถบเครื่องมือเมนูที่ด้านบนของหน้าจอ: "Repository"> "Repository settings"

"Repository" ถูกเน้นในแถบเมนูด้านบน

  1. "เพิ่ม"

ปุ่ม "เพิ่ม" ที่ด้านล่างของกล่องโต้ตอบ

  1. กลับไปที่ GitHub และคัดลอก URL โคลน

ปุ่ม "โคลนหรือดาวน์โหลด" บนเว็บไซต์ Github ตามด้วย git url

  1. วาง URL ลงในช่อง "URL / เส้นทาง" จากนั้นตั้งชื่อที่เหมาะสม ฉันเรียกมันว่า "ปรมาจารย์" ไม่ตรวจสอบ "เริ่มต้นจากระยะไกล" ช่องทำเครื่องหมาย คุณจะไม่สามารถผลักดันโดยตรงไปยังที่เก็บนี้

ฟิลด์ "ชื่อระยะไกล" และ "URL / เส้นทาง" ถูกเน้นในกล่องโต้ตอบ "รายละเอียดระยะไกล"

  1. กด "ตกลง" และคุณจะเห็นมันปรากฏในรายการที่เก็บของคุณทันที

เพิ่มที่เก็บ "master" ในรายการที่เก็บในกล่องโต้ตอบ "การตั้งค่าที่เก็บ"

  1. กด "ตกลง" อีกครั้งและคุณจะเห็นมันปรากฏในรายการ "รีโมท" ของคุณ

พื้นที่เก็บข้อมูล "ต้นแบบ" ถูกเน้นในรายการรีโมทในแถบด้านข้าง

  1. คลิกปุ่ม "ดึงข้อมูล" (ด้านบนซ้ายของพื้นที่ส่วนหัวของต้นไม้แหล่งที่มา)

ปุ่ม "ดึงข้อมูล" ในพื้นที่ส่วนหัว

  1. ตรวจสอบให้แน่ใจว่าได้ทำเครื่องหมายในช่อง "ดึงข้อมูลจากรีโมท" แล้วกด "ตกลง"

ช่องทำเครื่องหมาย "ดึงข้อมูลจากรีโมททั้งหมด" ถูกเน้นในกล่องโต้ตอบ "ดึงข้อมูล"

  1. คลิกสองครั้งที่สาขา "ต้นแบบ" ของคุณเพื่อตรวจสอบว่ายังไม่ได้ชำระเงิน

  2. ค้นหาการกระทำที่คุณต้องการรีเซ็ตหากคุณเรียกว่า repo "master" คุณจะต้องการค้นหาการกระทำด้วยแท็ก "master / master"

ตัวอย่างของการคอมมิตด้วยแท็ก "master / master"

  1. คลิกขวาที่การกระทำ> "รีเซ็ตสาขาปัจจุบันเป็นการกระทำนี้"

  2. ในกล่องโต้ตอบให้ตั้งค่าฟิลด์ "การใช้โหมด:" เป็น "ยกเลิกการเปลี่ยนแปลงการคัดลอกการทำงานทั้งหมด" จากนั้นกด "ตกลง" (ตรวจสอบให้แน่ใจว่าได้ใส่การเปลี่ยนแปลงใด ๆ ที่คุณไม่ต้องการเสียลงในสาขาแยกต่างหากก่อน)

ฟิลด์ "การใช้โหมด" ถูกเน้นในกล่องโต้ตอบ "รีเซ็ตเป็นการส่งมอบ"  มันถูกตั้งค่าเป็น "ยกเลิกการเปลี่ยนแปลงการคัดลอกที่ทำงานทั้งหมด"

  1. คลิกปุ่ม "กด" (ด้านบนซ้ายของพื้นที่ส่วนหัวของต้นไม้แหล่งที่มา) เพื่ออัปโหลดการเปลี่ยนแปลงไปยังสำเนาของ repo ของคุณ

ปุ่ม "กด" ในพื้นที่ส่วนหัว

คุณเสร็จแล้ว!

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