สาขาจากการกระทำก่อนหน้าโดยใช้ Git


1798

ถ้าฉันมีข้อผูกพันฉันจะแยกสาขาจากเอ็น -3 ได้อย่างไร

ฉันสามารถเห็นแฮชของทุกการกระทำ

คำตอบ:


2547

คุณสามารถสร้างสาขาผ่านแฮช:

git branch branchname <sha1-of-commit>

หรือโดยใช้การอ้างอิงสัญลักษณ์:

git branch branchname HEAD~3

หากต้องการชำระเงินเมื่อสร้างสาขาให้ใช้

git checkout -b branchname <sha1-of-commit or HEAD~3>

42
Git 1.8.2 ขอผมใช้ sha1 แบบสั้นสำหรับแบบแรก
Dan Benamy

53
@MattFenwick Git จะอนุญาตให้คุณใช้แฮชแบบสั้นลงในทุกที่ที่แฮชอนุญาตตราบใดที่แฮชแบบสั้นคือ '' ที่ไม่ซ้ำกัน '' ในที่เก็บ ดังนั้นถ้ามันไม่ทำงานลองเพิ่มตัวละครอื่นจากแฮช
โผล่

29
เพื่อผลักสาขาใหม่อย่างถูกต้องไปยังเซิร์ฟเวอร์ .. ต้องการขั้นตอนสุดท้าย:git push origin BRANCH_NAME
Gene Bo

3
เพื่อเริ่มต้นสาขาจากการ<sha1-of-commit>รันgit checkout -b <name-of-branch> <sha1-of-commit>แต่ถ้าสาขานั้นมีอยู่แล้วgit checkout -B <name-of-branch> <sha1-of-commit>
mostafazh

258

เมื่อต้องการทำสิ่งนี้บน github.com:

  1. ไปที่โครงการของคุณ
  2. คลิกที่ "มุ่งมั่น"
  3. คลิกที่<> ("เรียกดูพื้นที่เก็บข้อมูล ณ จุดนี้ในประวัติ") บนคอมมิทที่คุณต้องการแยกสาขา
  4. คลิกที่ "tree: xxxxxx" ด้านบนซ้าย ด้านล่างแถบสถิติภาษาคุณจะได้รับตัวเลือก "ค้นหาหรือสร้างสาขา" (เพียงพิมพ์ชื่อสาขาใหม่ที่นั่น)สาขาจากการกระทำก่อนหน้า

4
คำถามไม่เกี่ยวกับ GitHub แต่เกี่ยวกับ Git เซิร์ฟเวอร์ git ส่วนใหญ่ไม่ใช่ git
Anders Tornblad

46
แม้ว่าข้อเท็จจริงที่ว่านี่คือ Github ไม่ใช่ git แต่ก็ยังมีประโยชน์อย่างมาก!
Liz

น่าเสียดายที่มันยังคงแสดงการเปลี่ยนแปลงจากคอมมิชชันอื่น ๆ ซึ่งฉันต้องการหลีกเลี่ยงซึ่งเป็นสาเหตุที่ฉันค้นหาคำถามนี้
Maxim

83

มายากลสามารถทำได้โดยการตั้งค่าคอมไพล์

  1. สร้างสาขาใหม่และเปลี่ยนเป็นสาขา (เพื่อเก็บค่าคอมมิชชันล่าสุดทั้งหมดของคุณที่นี่)

    git checkout -b your_new_branch

  2. เปลี่ยนกลับเป็นสาขาที่ทำงานก่อนหน้านี้ (ถือว่าเป็นหลัก)

    git checkout master

  3. ลบการคอมมิท x ล่าสุดรักษาความสะอาดของมาสเตอร์

    git reset --hard HEAD~x # in your case, x = 3

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


7
นี่คือสิ่งที่ฉันกำลังมองหาเพราะมันลบพันธะจากอาจารย์และทำให้มันราวกับว่าคุณจำได้ว่าจะทำให้สาขาก่อนที่จะกระทำเหล่านั้น ขอบคุณ
superbeck

7
ก็อย่าลืมว่าgit reset --hardไม่เป็นความคิดที่ดีถ้าคุณได้มีการผลักดันกระทำที่มา ...
LuisF

1
คุณสามารถgit push --force ถ้าคุณได้ผลักสาขาก่อน
มิลาน

แต่ระวังให้ดีเมื่อใช้ --force blog.developer.atlassian.com/force-with-lease
peater

74

หากคุณไม่แน่ใจว่าต้องการมอบหมายสาขาใดล่วงหน้าคุณสามารถตรวจสอบคอมมิชชันและตรวจสอบโค้ดของพวกเขา (ดูซอร์สคอมไพล์การทดสอบ) โดย

git checkout <sha1-of-commit>

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

git checkout -b <branch_name>

22
git checkout -b <branch-name> <sha1-of-commit>

1
สิ่งนี้แตกต่างจาก " git branch branchname <sha1-of-commit>" (จากคำตอบที่ยอมรับ) อย่างไร
Peter Mortensen

ฉันไม่รู้ ฉันคิดว่าพวกเขาเท่าเทียมกัน ฉันมักจะใช้git checkout -bเพื่อสร้างสาขาใหม่
ไทเลอร์ลอง

10
stackoverflow.com/a/7987711/3590629สาขาคอมไพล์ ... สร้างสาขา แต่ทิ้งคุณไว้ที่สาขาปัจจุบัน git checkout -b ... สร้างสาขาและเปลี่ยนเป็นคุณ
esme_louise

9

วิธีที่รวดเร็วในการทำธุรกรรม Github ของคุณจะเป็นดังนี้:

  • ค้นหาการกระทำที่เฉพาะเจาะจงจากสาขาของคุณ
  • ข้างรหัส SHA คลิก 'เรียกดู repo ณ จุดนี้ในประวัติ'
  • ที่นี่คุณสามารถสร้างสาขาใหม่จากการกระทำนี้ ป้อนคำอธิบายรูปภาพที่นี่

1
สิ่งนี้ล้าสมัยจริง ๆ
regetskcob

2
คำถามไม่เกี่ยวกับ GitHub
Anders Tornblad

8

เพียงแค่เรียกใช้:

git checkout -b branch-name <commit>

ตัวอย่างเช่น :

git checkout -b import/january-2019 1d0fa4fa9ea961182114b63976482e634a8067b8

checkoutคำสั่งกับพารามิเตอร์-bจะสร้างสาขาใหม่และมันจะเปลี่ยนไปมัน


1
ฉันชอบอันนี้มาก ขอบคุณ
คนโง่

เป็นไปได้ไหมที่จะสร้างสาขาตาม SHA ที่กระทำของสาขาฟีเจอร์ที่ถูกลบผ่านคำขอดึง หรือฉันต้องแยกสาขาจากการส่งคำขอดึงไปยังเจ้านาย?
user2966445

เรียกใช้git fetch& git branchคำสั่งในโฟลเดอร์โครงการของคุณโดยใช้เทอร์มินัลจากนั้นตรวจสอบว่าสาขาฟีเจอร์มีอยู่หรือไม่หากเป็นกรณีนี้ก็ใช่แน่นอนว่าคุณจะไม่สามารถสร้างสาขาจากสาขาที่ถูกลบได้คุณสามารถยกเลิกการลบสาขา สาขาหายไป
d1jhoni1b

4

คำถามที่เกี่ยวข้องมากคือ: คุณคิดยังไงกับ--helpตัวเลือกของ git? ลองทำสิ่งนี้:

git branch --help

เราเห็นผลลัพธ์นี้:

NAME
       git-branch - List, create, or delete branches    

SYNOPSIS
       git branch [--color[=<when>] | --no-color] [-r | -a]
               [--list] [-v [--abbrev=<length> | --no-abbrev]]
               [--column[=<options>] | --no-column]
               [(--merged | --no-merged | --contains) [<commit>]] [--sort=<key>]
               [--points-at <object>] [<pattern>...]
       git branch [--set-upstream | --track | --no-track] [-l] [-f] <branchname> [<start-point>]
       git branch (--set-upstream-to=<upstream> | -u <upstream>) [<branchname>]
       git branch --unset-upstream [<branchname>]
       git branch (-m | -M) [<oldbranch>] <newbranch>
       git branch (-d | -D) [-r] <branchname>...
       git branch --edit-description [<branchname>]

Gobbledegook

ค้นหาข้อความที่ตามมาเพื่อหาคำว่า "กระทำ" เราพบสิ่งนี้:

   <start-point>
       The new branch head will point to this commit. It may be given as a branch name, a
       commit-id, or a tag. If this option is omitted, the current HEAD will be used instead.

เรากำลังจะไปที่ไหนซักแห่ง!

ตอนนี้มุ่งเน้นไปที่บรรทัดของ gobbledegook:

git branch [--set-upstream | --track | --no-track] [-l] [-f] <branchname> [<start-point>]

ย่อว่า:

git branch <branchname> [<start-point>]

และเสร็จแล้ว


1
ฉันเกลียดคอมไพล์ ขอบคุณ
Byron Whitlock

4

ในการทำเช่นนี้ใน Eclipse:

  • ไปที่ "Git Repository Exploring" Perspective
  • ขยาย "แท็ก" และเลือกการมอบหมายที่คุณต้องการสร้างสาขา
  • คลิกขวาที่การส่งและเลือก "สร้างสาขา"
  • ระบุชื่อสาขา

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


3

คุณสามารถทำได้ใน Stash

  1. คลิกการกระทำ
  2. ที่ด้านบนขวาของหน้าจอคลิก "แท็กกระทำนี้"
  3. จากนั้นคุณสามารถสร้างสาขาใหม่จากแท็กที่คุณเพิ่งสร้าง

GUI นี้คืออะไร GitHub?
ostrichofevil

Atlassian Stash
David Ruan

3

ฉันสามารถทำมันได้เช่น:

git branch new_branch_name `git log -n 1 --skip 3 --format=%H`

ที่คุณจะต้องป้อนค่าข้าม 0 คือล่าสุด 1 คือก่อนหน้า 2 คือกระทำก่อนหน้านั้นเป็นต้น


4
ทำไมไม่ใช้HEAD~1(โดยที่ 1 ระบุ 1 กระทำการย้อนกลับ)?
jduncanator

1
วิธีการของคุณครอบคลุมโดยคำตอบที่เลือกและทำงานได้ดี Mine เป็นวิธีที่แตกต่างจากคำตอบที่เลือก
Mike Graf

3

สิ่งนี้จะสร้างสาขาด้วยคำสั่งเดียว:

git push origin <sha1-of-commit>:refs/heads/<branch-name>

ฉันชอบวิธีนี้ดีกว่าที่เผยแพร่ข้างต้นเพราะสร้างสาขาทันที (ไม่ต้องการคำสั่ง push พิเศษหลังจากนั้น)


3

ใช้Sourcetree | วิธีที่ง่ายที่สุด

  • ขั้นแรกให้ชำระเงินที่สาขาที่คุณต้องการใช้ความมุ่งมั่นเฉพาะเพื่อสร้างสาขาใหม่
  • จากนั้นดูที่แถบเครื่องมือเลือก Repository> Branch ... ทางลัดคือ Command + Shift + B
  • และเลือกข้อผูกพันเฉพาะที่คุณต้องการใช้ และตั้งชื่อสาขาใหม่จากนั้นสร้างสาขา!

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


ในที่สุดก็พบคำตอบที่มีประโยชน์นี้ ขอบคุณ
Firda Sahidi

1

นี่คือสิ่งที่ฉันทำ:

C:\Users\[path]\build>git checkout -b responsivenavigation 8a75b001096536b3216022484af3026aa9c7bb5b
Switched to a new branch 'responsivenavigation'

C:\Users\jaimemontoya\Dropbox\CuponClub\androidapp\build>git branch
  master
* responsivenavigation

ในกรณีนี้8a75b001096536b3216022484af3026aa9c7bb5bคือและเก่ากระทำเป็นของmasterสาขา


1

ไปที่คอมมิทเฉพาะของที่เก็บคอมไพล์

บางครั้งเมื่อทำงานกับพื้นที่เก็บข้อมูล git คุณต้องการกลับไปที่การมอบหมาย (การแก้ไข) ที่เฉพาะเจาะจงเพื่อให้มีภาพรวมของโครงการของคุณในเวลาที่กำหนด ในการทำสิ่งที่คุณต้องการแฮช SHA-1 ของการคอมมิทที่คุณสามารถค้นหาการตรวจสอบบันทึกได้อย่างง่ายดายด้วยคำสั่ง:

git log --abbrev-commit --pretty=oneline

ซึ่งจะให้รายการขนาดกะทัดรัดของคอมมิชชันทั้งหมดและเวอร์ชั่นสั้นของแฮช SHA-1

หลังจากที่คุณทราบแฮชของการคอมมิทที่คุณต้องการไปคุณสามารถใช้หนึ่งใน 2 คำสั่งต่อไปนี้:

git checkout HASH

หรือ

git reset --hard HASH

เช็คเอาท์

git checkout <commit> <paths>

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

หากไม่ได้รับสาขา git จะถือว่า HEAD กระทำ

git checkout <path> // restores path from your last commit. It is a 'filesystem-undo'.

หากไม่ได้รับเส้นทาง git จะย้ายHEADไปยังการกระทำที่ให้ไว้ (ดังนั้นการเปลี่ยนการกระทำที่คุณกำลังทำอยู่)

git checkout branch //means switching branches.

รีเซ็ต

git reset <commit> //re-sets the current pointer to the given commit.

หากคุณอยู่ในสาขา (โดยปกติคุณควรจะ) HEADและสาขานี้จะย้ายไปกระทำ

ถ้าคุณอยู่ในแฝดรัฐรีเซ็ตคอมไพล์ไม่ย้ายเท่านั้นHEAD หากต้องการรีเซ็ตสาขาให้ตรวจสอบก่อนHEAD

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


2
ขอบคุณสำหรับคำตอบของคุณ FYI: สิ่งนี้: git log --abbrev-commit --pretty=oneline สามารถย่อได้git log --oneline
Suhaib

0

เลือกกระทำ

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

ป้อนชื่อสาขา

เห็นภาพประวัติศาสตร์ทั้งหมด


สิ่งนี้จะใช้ได้ต่อเมื่อผู้ใช้ที่ใช้ระบบปฏิบัติการ UI เช่น Windows & MAC
Saurabhcdt

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

0

วิธีทำคำตอบที่ยอมรับใน Visual Studio 2015 และ 2017:

คลิกในการเปลี่ยนแปลง

คลิกในการเปลี่ยนแปลง (ลูกศรสีแดงด้านบน)

คลิกการกระทำเพื่อดูประวัติ

คลิกในการกระทำ (ลูกศรสีแดงด้านบน) และคลิกในดูประวัติบนเมนูแบบเลื่อนลง

และแท็บใหม่จะเปิดขึ้น:

แท็บประวัติ

และคุณควรคลิกขวาที่การยอมรับก่อนหน้านี้ว่าคุณต้องการให้รหัสของคุณเปลี่ยนกลับเป็น: คลิกขวาที่การคอมมิชชันก่อนหน้า

เลือกชำระเงินสาขาใหม่และvoilá!

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

คลิกขวาที่การกระทำก่อนหน้าและกำหนดใหม่


โปรดแบ่งปันคำตอบของคุณเป็นภาษาอังกฤษเนื่องจากพวกเราส่วนใหญ่ที่นี่ไม่พูดหรือรู้ภาษาต่างประเทศอื่น ๆ นอกจากภาษาอังกฤษ
Shamiul Hasan Rumman

@ShamiulHasanRumman ในข้อความที่อธิบายภาพ - ด้านล่างโดยปกติ - ฉันแปล Red Arrow ชี้ไปที่คำภาษาอังกฤษเช่นนั้นคลิกในการดำเนินการ (ลูกศรสีแดงด้านบน)มันไม่เพียงพอหรือ
Marcelo Scofano

@MarceloScofano เป็นเรื่องยากไหมที่จะเปลี่ยนเครื่องมือแก้ไขเป็นภาษาอังกฤษก่อนที่จะถ่ายภาพหน้าจอ?
Andrew Surdu

1
@AndreiSurdu: เพราะฉันไม่จำเป็นต้องทำเช่นนั้นฉันคาดว่าการเปลี่ยนเป็นภาษาอังกฤษฉันต้องติดตั้งแพคเกจพิเศษบางอย่าง แต่คุณถูกต้องเพียงรีสตาร์ท VS ไม่ต้องติดตั้งเลย ฉันจะพยายามเปลี่ยนภาพด้านบนทันทีที่ฉันมีเวลาว่าง
Marcelo Scofano

0

ถ้าคุณใช้ซอร์สทรีที่ตรงไปตรงมา

  • คลิกขวาที่คอมมิชชันจากตำแหน่งที่คุณต้องการสร้างสาขาใหม่
  • คลิกที่ 'สาขา'
  • พิมพ์ชื่อสาขาใหม่ในกล่องโต้ตอบปรากฏขึ้นและคลิก 'สร้างสาขา'

0

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

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