รีเซ็ตสาขาที่เก็บในตัวเครื่องให้เป็นเหมือนที่เก็บข้อมูลระยะไกล HEAD


3851

ฉันจะรีเซ็ตสาขาในพื้นที่ของฉันให้เหมือนกับสาขาบนที่เก็บระยะไกลได้อย่างไร

ฉันทำ:

git reset --hard HEAD

แต่เมื่อผมทำงานgit status,

On branch master
Changes to be committed:
  (use "git reset HEAD <file>..." to unstage)
      modified:   java/com/mycompany/TestContacts.java
      modified:   java/com/mycompany/TestParser.java

คุณช่วยเล่าให้ฉันฟังหน่อยได้ไหมว่าทำไมฉันถึงได้ 'แก้ไข' เหล่านี้ ฉันไม่ได้แตะไฟล์เหล่านี้? ถ้าฉันทำฉันต้องการลบสิ่งเหล่านั้น


8
ตามเอาต์พุตของgit statusคำสั่งที่สองของคุณgit reset --hard HEADล้มเหลว อย่างไรก็ตามคุณไม่ได้วางผลลัพธ์ลง →คำถามที่ไม่สมบูรณ์
Robert Siemer

2
คุณกำลังผสมสองประเด็นที่นี่: 1) วิธีการตั้งค่าสาขาในท้องถิ่นเพื่อจุดที่ห่างไกลและ 2) วิธีการล้างพื้นที่การแสดงละครของคุณ (และอาจไดเรกทอรีที่ทำงาน) ดังนั้นที่บอกว่าgit status nothing to commit, working directory clean- โปรดระบุ!
Robert Siemer

คำตอบ:


6687

การตั้งค่าสาขาของคุณให้ตรงกับสาขาระยะไกลสามารถทำได้สองขั้นตอน:

git fetch origin
git reset --hard origin/master

หากคุณต้องการบันทึกสถานะสาขาปัจจุบันของคุณก่อนที่จะทำสิ่งนี้ (ในกรณี) คุณสามารถทำได้:

git commit -a -m "Saving my work, just in case"
git branch my-saved-work

ตอนนี้งานของคุณจะถูกบันทึกในสาขา "my-save-work" ในกรณีที่คุณตัดสินใจว่าคุณต้องการกลับมา (หรือต้องการดูในภายหลังหรือแตกต่างกับสาขาที่อัปเดตของคุณ)

โปรดทราบว่าตัวอย่างแรกสมมติว่าชื่อของ repo ระยะไกลคือ "ต้นกำเนิด" และสาขาที่ชื่อว่า "ต้นแบบ" ใน repo ระยะไกลตรงกับสาขาที่เช็คเอาท์ในปัจจุบันใน repo ท้องถิ่นของคุณ

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


4
ขอบคุณสำหรับคำตอบ. คุณพูดว่า 'โปรดทราบว่าตัวอย่างแรกถือว่าว่าชื่อ repo ระยะไกลคือ "ต้นกำเนิด" และสาขาที่ชื่อว่า "master" ใน repo ระยะไกลตรงกับสาขาใน repo ท้องถิ่นของคุณ' ฉันจะตรวจสอบชื่อ repo ระยะไกลของฉันและชื่อสาขาของฉันเพื่อให้แน่ใจก่อนที่จะดำเนินการ 'git รีเซ็ต - ฮาร์ด' ได้อย่างไร ขอบคุณอีกครั้ง.
hap497

21
หากคุณไม่ได้ตั้งชื่อรีโมทอย่างชัดเจนแสดงว่าชื่อนั้นน่าจะเป็นแค่ "ต้นทาง" (ค่าเริ่มต้น) คุณสามารถใช้ "git รีโมต" เพื่อรับรายการของชื่อรีโมตทั้งหมด จากนั้นคุณสามารถใช้ "git remote <name>" เพื่อดูว่าสาขาใดที่ผลัก / ดึงด้วยกัน (เช่นถ้าสาขา "ต้นแบบ" ของคุณถูกโคลนจาก "ต้นแบบ" ในชื่อ "แหล่งกำเนิด" ระยะไกลคุณจะได้รับบรรทัด ที่ระบุว่า "ต้นแบบผสานกับต้นแบบระยะไกล")
Dan Molding

6
"ไม่แนะนำให้เข้าไปในพื้นที่เก็บข้อมูลที่ไม่ได้เปลือยเปล่า (และไม่ควรเข้าสาขาที่เช็คเอาท์ในปัจจุบันโดยเฉพาะ" ทำไมถึงเป็นเช่นนั้น
LeeGee

27
หลังจากเรียกผมเชื่อว่าคุณสามารถทำได้git reset FETCH_HEAD --hardแทนนั่นคือความหมายเดียวกัน
Jean

6
มันไม่ได้ลบไฟล์ที่ฉันได้เพิ่ม
Trismegistos

416

ฉันต้องทำ (วิธีแก้ปัญหาในคำตอบที่ยอมรับ):

git fetch origin
git reset --hard origin/master

ติดตามโดย:

git clean -f

เพื่อลบไฟล์ในเครื่อง

หากต้องการดูว่าไฟล์ใดที่จะถูกลบ (โดยไม่ลบออกจริงๆ):

git clean -n -f

89
นอกจากนี้git clean -d -fหากมีไดเรกทอรีที่ไม่ได้ติดตามอยู่
garg

54
ยังgit clean -fdx
Swapnil Kotwal

14
หากคุณต้องการสำเนาสาขาระยะไกลที่แน่นอนคุณต้องทำตามโดย git clean -ffdx โปรดทราบว่า thare สอง f
Trismegistos

6
นั่นgit clean -fคือสิ่งที่ฉันต้องการ ขอบคุณ!
dgo

17
ระวังการใช้คำสั่ง clean มันสามารถลบไฟล์ที่ถูกละเว้นจากสาขาอื่น ๆ
mikoop

307

ก่อนอื่นให้รีเซ็ตเป็นHEADสาขาต้นน้ำที่ดึงมาก่อนหน้านี้:

git reset --hard @{u}

ข้อดีของการระบุ@{u}หรือรูปแบบ verbose @{upstream}คือชื่อของ repo ระยะไกลและสาขาไม่จำเป็นต้องระบุอย่างชัดเจน

ถัดไปตามความจำเป็นให้ลบไฟล์ที่ไม่ได้ติดตามและอาจเลือกด้วย-x:

git clean -df

ในที่สุดตามความจำเป็นได้รับการเปลี่ยนแปลงล่าสุด:

git pull

54
ดูเหมือนว่าจะเป็นคำตอบที่ดีกว่าคำตอบที่ยอมรับเพราะมันจะรีเซ็ตเป็นสาขาต้นน้ำในปัจจุบันมากกว่าจะเป็นแบบคงที่เช่นorigin/master
Jon z

@Jonz จุดที่@{upstream}มีประโยชน์มากและสามารถนำมาใช้ในนามแฝง:alias resetthisbranch="git reset --hard @{upstream}"
Siddhartha

1
@GangadharJannu git reset --hardต้องการการยืนยันมิฉะนั้นจะไม่รู้ว่าจะรีเซ็ตคุณเป็นอย่างไร @{u}ชี้ไปที่เฉพาะเจาะจงกระทำ - git fetchหัวหน้าสาขาติดตามจากเมื่อคุณไม่ได้ที่ผ่านมา
Kristoffer Bakkejord

1
@KristofferBakkejord ขอบคุณสำหรับคำอธิบาย แต่ถึงแม้จะไม่ได้ทำแฮชเราก็สามารถทำได้git reset --hardแม้ว่ามันจะไม่รีเซ็ตเป็นรีโมตสาขา
Gangadhar JANNU

3
สำหรับคนอื่นที่เกือบจะเปิดคำถามใหม่ที่นี่ถ้าคุณคอมไพล์จาก Powershell ให้ใช้เครื่องหมายคำพูด ( git reset --hard "@{u}") เอาฉันไปคิดดูสิ
MPStoering

112

git reset --hard HEADจริงแล้วรีเซ็ตเป็นสถานะที่คอมมิทล่าสุด ในกรณีนี้ HEAD หมายถึง HEAD ของสาขาของคุณ

หากคุณมีข้อผูกพันหลายอย่างการทำเช่นนี้จะไม่ได้ผล ..

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

git reset --hard origin/HEAD

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


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

73

ข้อเสนอแนะทั้งหมดข้างต้นนั้นถูกต้อง แต่บ่อยครั้งที่จะรีเซ็ตโครงการของคุณจริง ๆคุณต้องลบไฟล์ที่อยู่ในไฟล์ของคุณ.gitignoreด้วย

ในการรับค่าทางศีลธรรมที่เทียบเท่ากับการลบไดเรกทอรีโครงการของคุณและการโคลนซ้ำจากระยะไกลคือ:

git fetch
git reset --hard
git clean -x -d -f

คำเตือน : git clean -x -d -fเป็นกลับไม่ได้และคุณอาจสูญเสียไฟล์และข้อมูล (เช่นสิ่งที่คุณได้ละเลยใช้.gitignore)


12
คำเตือน: "git clean -x -d -f" ไม่สามารถย้อนกลับได้และคุณอาจหลวมไฟล์และข้อมูลใน. gitignore
Akarsh Satija

เล็ก ๆ น้อย ๆ สั้น: ที่เท่ากับgit clean -xdf git clean -x -d -f
Kiryl

คอมไพล์สะอาด -ffxd เพื่อลบทุกอย่างที่ไม่อยู่ใน repo
Trismegistos

44

ใช้คำสั่งด้านล่าง คำสั่งเหล่านี้จะลบไฟล์ที่ไม่ได้ติดตามทั้งหมดออกจากระบบคอมไพล์ด้วย

git fetch origin
git reset --hard origin/master
git clean -d -f

6
นี่คือการตอบสนองที่สมบูรณ์มากขึ้นเพราะไม่มีgit clean -d -fเราจะยังมีบางอย่างของสาขาเก่าในไดเรกทอรีท้องถิ่น ขอบคุณชาย
Flavio

3
นี่คือสิ่งที่จริงทำให้มันเป็นเหมือนรีโมท ความสะอาดเป็นสิ่งสำคัญ
David S.

1
คอมไพล์สะอาด -ffxd เพื่อลบทุกอย่างแท้จริง
Trismegistos

1
นี่คือสิ่งที่ฉันต้องการ ขอบคุณ
AllJs

38

คำถามผสมสองประเด็นที่นี่:

  1. วิธีรีเซ็ตสาขาท้องถิ่นไปยังจุดที่รีโมตอยู่
  2. วิธีล้างพื้นที่จัดเตรียมของคุณ (และอาจเป็นไดเรกทอรีที่ใช้งานได้) ดังนั้นมันจึงgit statusบอกว่าnothing to commit, working directory clean.

คำตอบเดียวคือ:

  1. git fetch --prune (ทางเลือก) อัพเดตสแน็ปช็อตโลคัลของ repo รีโมต คำสั่งเพิ่มเติมเป็นแบบโลคัลเท่านั้น
    git reset --hard @{upstream}วางตัวชี้สาขาโลคัลไปที่สแน็ปช็อตของรีโมตรวมถึงตั้งค่าดัชนีและไดเร็กทอรีการทำงานเป็นไฟล์ของคอมมิทนั้น
  2. git clean -d --force ลบไฟล์และไดเรกทอรีที่ไม่ได้ติดตามซึ่งขัดขวางการคอมไพล์เพื่อพูดว่า“ ทำความสะอาดไดเรกทอรีทำงาน”

1
ไวยากรณ์ต้องต้นน้ำเพื่อเป็นชุดที่เกิดขึ้นโดยค่าเริ่มต้นถ้าคุณ@{upstream} git checkout <branchname>- origin/<branchname>มิฉะนั้นแทนที่ด้วย
Robert Siemer

เพิ่ม-xในgit cleanเพื่อลบทุกสิ่งที่ไม่ได้อยู่ในการส่งมอบ (เช่นแม้แต่ไฟล์ที่ถูกละเว้นด้วยกลไก. gitignore)
Robert Siemer

22

นี่คือสิ่งที่ฉันเผชิญเป็นประจำ & ฉันได้สรุปสคริปต์ Wolfgang ที่มีให้ด้านบนเพื่อทำงานกับสาขาใด ๆ

ฉันยังได้เพิ่มพรอมต์ "คุณแน่ใจ" & เอาท์พุทข้อเสนอแนะบางอย่าง

#!/bin/bash
# reset the current repository
# WF 2012-10-15
# AT 2012-11-09
# see http://stackoverflow.com/questions/1628088/how-to-reset-my-local-repository-to-be-just-like-the-remote-repository-head
timestamp=`date "+%Y-%m-%d-%H_%M_%S"`
branchname=`git rev-parse --symbolic-full-name --abbrev-ref HEAD`
read -p "Reset branch $branchname to origin (y/n)? "
[ "$REPLY" != "y" ] || 
echo "about to auto-commit any changes"
git commit -a -m "auto commit at $timestamp"
if [ $? -eq 0 ]
then
  echo "Creating backup auto-save branch: auto-save-$branchname-at-$timestamp"
  git branch "auto-save-$branchname-at-$timestamp" 
fi
echo "now resetting to origin/$branchname"
git fetch origin
git reset --hard origin/$branchname

3
คุณอาจต้องการใช้ "git remote" เพื่อรับชื่อของ remote ในบางกรณีจะไม่เป็น "จุดเริ่มต้น"
Yurik

17

โดยมีเงื่อนไขว่าที่เก็บระยะไกลคือoriginและคุณสนใจbranch_name:

git fetch origin
git reset --hard origin/<branch_name>

นอกจากนี้คุณไปสำหรับรีเซ็ตสาขาปัจจุบันของการoriginHEAD

git fetch origin
git reset --hard origin/HEAD

มันทำงานอย่างไร:

git fetch origin ดาวน์โหลดล่าสุดจากระยะไกลโดยไม่พยายามผสานหรือรีบูตอะไร

จากนั้นgit resetรีเซ็ต<branch_name>สาขาเป็นสิ่งที่คุณเพิ่งดึง ตัวเลือกการเปลี่ยนแปลงไฟล์ทั้งหมดในต้นไม้การทำงานของคุณเพื่อให้ตรงกับไฟล์ใน--hardorigin/branch_name


14

ฉันทำ:

git branch -D master
git checkout master

เพื่อรีเซ็ตสาขาทั้งหมด


หมายเหตุคุณควรเช็คเอาต์ไปที่สาขาอื่นเพื่อให้สามารถลบสาขาที่ต้องการได้


5
คุณควรอ่านคำถามอีกครั้งไม่มีอะไรส่งผลกระทบต่อรีโมต แต่เป็นการตั้งค่าให้เหมือนกับรีโมตดังนั้นคุณไม่ควรทำอะไรกับรีโมตและสิ่งนี้ช่วยได้ในกรณีของฉัน
2846569

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

2
อย่างน้อยคุณควรลองทำสิ่งนี้หรืออ่านเอกสาร: kernel.org/pub/software/scm/git/docs/git-checkout.html
user2846569

วิธีไปฉันมีไฟล์. pck ที่เสียหายในสาขาและตัวเลือกที่เหลือไม่ทำงานขอบคุณ !!
LuckyBrain

14

นี่คือสคริปต์ที่ทำให้คำตอบที่ได้รับความนิยมมากที่สุดปรากฏขึ้นโดยอัตโนมัติ ... ดูที่https://stackoverflow.com/a/13308579/1497139สำหรับรุ่นที่ปรับปรุงซึ่งรองรับสาขา

#!/bin/bash
# reset the current repository
# WF 2012-10-15
# see /programming/1628088/how-to-reset-my-local-repository-to-be-just-like-the-remote-repository-head
timestamp=`date "+%Y-%m-%d-%H_%M_%S"`
git commit -a -m "auto commit at $timestamp"
if [ $? -eq 0 ]
then
  git branch "auto-save-at-$timestamp" 
fi
git fetch origin
git reset --hard origin/master

10

หากคุณมีปัญหากับฉันคุณได้ทำการเปลี่ยนแปลงไปแล้ว แต่ตอนนี้ไม่ว่าด้วยเหตุผลใดก็ตามที่คุณต้องการกำจัดมันวิธีที่เร็วที่สุดคือการใช้git resetสิ่งนี้:

git reset --hard HEAD~2

ฉันไม่ต้องการข้อผูกพัน 2 ข้อดังนั้นหมายเลข 2 คุณสามารถเปลี่ยนเป็นจำนวนข้อผูกมัดของคุณเองเพื่อรีเซ็ต

ดังนั้นการตอบคำถามของคุณ - ถ้าคุณ 5 คนที่ทำหน้าที่เป็นหัวหน้าพื้นที่เก็บข้อมูลระยะไกลคุณควรใช้คำสั่งนี้:

git reset --hard HEAD~5

โปรดสังเกตว่าคุณจะสูญเสียการเปลี่ยนแปลงที่คุณทำดังนั้นโปรดระวัง!


7

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

หากสาขา "mybranch" ยังไม่ได้ชำระเงินในขณะนี้เพื่อรีเซ็ตเป็นสาขาของ "myremote / mybranch" จากระยะไกลคุณสามารถใช้คำสั่งระดับต่ำนี้:

git update-ref refs/heads/mybranch myremote/mybranch

วิธีนี้จะทำให้สาขาที่เช็คเอาต์ตามเดิมและต้นไม้ทำงานไม่ถูกแตะต้อง มันแค่ขยับหัวของ mybranch ไปยังการกระทำอื่น ๆ สิ่งที่ได้รับเป็นอาร์กิวเมนต์ที่สอง สิ่งนี้จะเป็นประโยชน์อย่างยิ่งหากจำเป็นต้องอัปเดตสาขาหลายแห่งเป็นหัวหน้าระยะไกลใหม่

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


7

นี่คือสิ่งที่ฉันใช้บ่อย:

git fetch upstream develop;
git reset --hard upstream/develop;
git clean -d --force;

หมายเหตุว่ามันคือการปฏิบัติที่ดีที่จะไม่ทำให้เกิดการเปลี่ยนแปลงที่จะโทท้องถิ่นของคุณ / พัฒนาสาขา แต่แทนที่จะเช็คเอาท์ไปยังสาขาสำหรับการเปลี่ยนแปลงใด ๆ อีกด้วยชื่อสาขาใช้ได้ตามประเภทของการเปลี่ยนแปลงเช่นfeat/, chore/, fix/ฯลฯ ดังนั้นคุณจำเป็นต้องเท่านั้น ดึงการเปลี่ยนแปลงไม่ใช่ผลักการเปลี่ยนแปลงใด ๆ จากต้นแบบ สิ่งเดียวกันสำหรับสาขาอื่น ๆ ที่คนอื่นมีส่วนร่วม ดังนั้นควรใช้ข้างต้นหากคุณได้ทำการเปลี่ยนแปลงสาขาที่ผู้อื่นมุ่งมั่นและจำเป็นต้องรีเซ็ต มิฉะนั้นในอนาคตหลีกเลี่ยงการผลักดันไปยังสาขาที่คนอื่น ๆ ผลักดันให้แทนเช็คเอาต์และผลักดันไปยังสาขาดังกล่าวผ่านสาขาที่เช็คเอาท์

หากคุณต้องการรีเซ็ตสาขาในพื้นที่ของคุณเป็นความมุ่งมั่นล่าสุดในสาขาต้นน้ำสิ่งที่ได้ผลสำหรับฉันคือ:

ตรวจสอบรีโมทคุณให้แน่ใจว่าคุณต้นน้ำและแหล่งกำเนิดเป็นสิ่งที่คุณคาดหวังว่าหากไม่ได้ตามที่คาดไว้จากนั้นใช้git remote add upstream <insert URL>เช่นเดิม GitHub repo git remote add origin <insert URL of the forked GitHub repo>ที่คุณคดเคี้ยวจากและ

git remote --verbose

git checkout develop;
git commit -m "Saving work.";
git branch saved-work;
git fetch upstream develop;
git reset --hard upstream/develop;
git clean -d --force

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

git add .
git commit -m "Reset to upstream/develop"
git push --force origin develop

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

git merge -s recursive -X theirs develop

ในขณะใช้งาน

git merge -s recursive -X ours develop

เพื่อรักษาการเปลี่ยนแปลงที่ขัดแย้งกันของ branch_name มิฉะนั้นใช้ mergetool git mergetoolด้วย

ด้วยการเปลี่ยนแปลงทั้งหมดเข้าด้วยกัน:

git commit -m "Saving work.";
git branch saved-work;
git checkout develop;
git fetch upstream develop;
git reset --hard upstream/develop;
git clean -d --force;
git add .;
git commit -m "Reset to upstream/develop";
git push --force origin develop;
git checkout branch_name;
git merge develop;

โปรดทราบว่าแทนที่จะอัปสตรีม / พัฒนาคุณสามารถใช้แฮชการกระทำชื่อสาขาอื่น ๆ ฯลฯ ใช้เครื่องมือ CLI เช่น Oh My Zsh เพื่อตรวจสอบว่าสาขาของคุณเป็นสีเขียวแสดงว่าไม่มีอะไรที่ต้องทำและไดเรกทอรีการทำงานสะอาด ( ซึ่งได้รับการยืนยันหรือตรวจสอบโดยgit status) โปรดทราบว่านี่อาจเพิ่มคอมมิทเมื่อเทียบกับการพัฒนาอัปสตรีมหากมีสิ่งใดที่เพิ่มโดยอัตโนมัติเช่นคอมมิทแผนภาพ UML, ส่วนหัวลิขสิทธิ์ ฯลฯ ดังนั้นในกรณีนี้คุณสามารถดึงการเปลี่ยนแปลงorigin developไปupstream developได้หากจำเป็น


6

คำตอบ

git clean -d -f

underrated ( -dเพื่อลบไดเรกทอรี) ขอบคุณ!


และเต็มโฟลเดอร์สะอาด repo 100% git clean -xdfไม่มีไฟล์พิเศษวิ่ง นี่จะเป็นการลบไฟล์ใด ๆ และทั้งหมดที่ git ไม่ได้รับรู้และจะทำให้โฟลเดอร์ของคุณตรงกับสิ่งที่อยู่ในรายการวัตถุของ git อย่างแน่นอน โปรดทราบว่าคุณสามารถเพิ่ม-n(เช่นgit clean -nxdf) เพื่อดำเนินการ "what-if" และมันจะบอกคุณว่ามันจะลบโดยไม่ทำอะไรจริง ๆ ( ทำความสะอาดคอมไพล์ )
qJake

5

หากคุณต้องการที่จะกลับไปที่HEADรัฐทั้งไดเรกทอรีการทำงานและดัชนีแล้วคุณควรจะมากกว่าที่จะgit reset --hard HEAD HEAD^(นี่อาจเป็นตัวพิมพ์ผิดเหมือนเป็นตัวพิมพ์เดียวกับเส้นประสองครั้งสำหรับ--hard)

สำหรับคำถามเฉพาะของคุณเกี่ยวกับสาเหตุที่ไฟล์เหล่านั้นปรากฏในสถานะที่ถูกแก้ไขดูเหมือนว่าคุณอาจจะทำการรีเซ็ตแบบซอฟต์แทนการฮาร์ดรีเซ็ต นี่จะทำให้ไฟล์ที่ถูกเปลี่ยนแปลงในการคอมมิทHEADปรากฏขึ้นราวกับว่ามันถูก staged ซึ่งน่าจะเป็นสิ่งที่คุณเห็นที่นี่


4

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

โชคดีที่ฉันไม่มีสาขาอื่นที่ฉันใส่ใจ

xkcd: Git


1

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

REPO_PATH=$(pwd) && GIT_URL=$(git config --get remote.origin.url) && cd .. && rm -rf $REPO_PATH && git clone --recursive $GIT_URL $REPO_PATH && cd $REPO_PATH

* ถือว่าไฟล์. git ของคุณไม่เสียหาย


4
คุณสามารถติดตั้งระบบปฏิบัติการของคุณใหม่ได้หากคุณต้องการแน่ใจ!
Sebastian Scholle

1

คุณลืมที่จะสร้างฟีเจอร์สาขาและมุ่งมั่นโดยตรงกับต้นแบบโดยไม่ได้ตั้งใจ?

คุณสามารถสร้างสาขาฟีเจอร์ตอนนี้และตั้งหลักกลับโดยไม่กระทบกับworktree (ระบบไฟล์โลคอล) เพื่อหลีกเลี่ยงการทริกเกอร์การสร้างการทดสอบและปัญหาเกี่ยวกับการล็อคไฟล์:

git checkout -b feature-branch
git branch -f master origin/master


-3

หากคุณไม่ต้องการบันทึกการเปลี่ยนแปลงในพื้นที่ของคุณ แต่ยังต้องการอัปเดตที่เก็บของคุณให้ตรงกับจุดเริ่มต้น / HEAD คุณสามารถซ่อนการเปลี่ยนแปลงในเครื่องของคุณแล้วดึง:

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