ฉันจะค้นหาความมุ่งมั่นต่อไปในคอมไพล์ได้อย่างไร (เด็ก / เด็กอ้างอิง)


236

ref^หมายถึงการคอมมิชชันก่อนหน้าrefนี้สิ่งที่เกี่ยวกับการรับคอมมิชชันหลังจาก ref ?

ตัวอย่างเช่นหากฉันgit checkout 12345จะตรวจสอบการส่งมอบครั้งต่อไปได้อย่างไร

ขอบคุณ

PS ใช่ git นั้นเป็น DAG ตัวชี้โหนดโครงสร้างต้นไม้ ฉันจะค้นหาความมุ่งมั่นหลังจากนี้ได้อย่างไร



2
ดูเพิ่มเติม " git children-of"!
VonC

คำตอบ:


185

หากต้องการแสดงรายการการกระทำทั้งหมดเริ่มต้นจากปัจจุบันและจากนั้นลูกของมันและอื่น ๆ - โดยทั่วไปบันทึก git มาตรฐาน แต่ไปทางอื่นในเวลาใช้สิ่งที่ชอบ

git log --reverse --ancestry-path 894e8b4e93d8f3^..master

โดยที่ 894e8b4e93d8f3 เป็นรายการแรกที่คุณต้องการแสดง


3
สำหรับกรณีเฉพาะในคำถามเดิมเพียงทดแทนสำหรับHEAD^ 894e8b4e93d8f3^
SørenLøvborg

2
อาจจะเพิ่ม --oneline เป็นผลลัพธ์ผลลัพธ์ที่สั้นกว่า
firo

1
ฉันจำเป็นต้องใช้..., ^..ล้มเหลวอย่างเงียบ ๆ
TankorSmash

1
เริ่มใช้งานfatal: unrecognized argument: --ancestry-pathgit เวอร์ชั่น 1.7.1
user151841

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

37

ผู้สร้างฮัดสัน (ตอนนี้เจนกินส์) โคะสุเกะคาวากุจิเพิ่งเผยแพร่ (พฤศจิกายน 2556):
kohsuke / git-children-of :

เมื่อได้รับมอบหมายให้ค้นหาลูกทันทีของการกระทำนั้น

#!/bin/bash -e
# given a commit, find immediate children of that commit.
for arg in "$@"; do
  for commit in $(git rev-parse $arg^0); do
    for child in $(git log --format='%H %P' --all | grep -F " $commit" | cut -f1 -d' '); do
      git describe $child
    done
  done
done

ตามที่แสดงโดยเธรดนี้ใน VCS ตามประวัติที่แสดงโดยDAG (Directed Acyclic Graph)ไม่มี "หนึ่งพาเรนต์" หรือ "หนึ่งลูก"

        C1 -> C2 -> C3
      /               \
A -> B                  E -> F
      \               /
        D1 -> D2 ----/

การสั่งซื้อสินค้าจะกระทำโดย "topo-order" หรือ "date-order" (ดูที่หนังสือ GitPro )

แต่ตั้งแต่Git1.6.0คุณสามารถแสดงรายการลูกของการกระทำได้

git rev-list --children
git log --children

หมายเหตุ: สำหรับการกระทำของพ่อแม่คุณจะมีปัญหาเดียวกันมีคำต่อท้าย^ไปพารามิเตอร์การแก้ไขความหมายแรกที่แม่ของว่ากระทำวัตถุ ^<n>หมายถึง<n>ผู้ปกครองที่สอง (เช่นrev^ เทียบเท่าrev^1)

หากคุณอยู่ในสาขาfooและออก " git merge bar" fooจะเป็นพาเรนต์แรก
Ie: ผู้ปกครองคนแรกคือสาขาที่คุณอยู่เมื่อคุณรวมและที่สองคือความมุ่งมั่นในสาขาที่คุณรวม


6
git rev-list --childrenแน่นอนว่าดูเหมือนว่าฉันต้องการ แต่มันไม่ใช่ DWIM ดูเหมือนจะแสดงรายการผู้ปกครองและลูก ๆ ของพวกเขาทั้งหมด ฉันคิดว่าฉันสามารถแสดงรายการพวกเขาทั้งหมดและแยกวิเคราะห์ผ่านพวกเขา ... bleh แต่บางสิ่งบางอย่าง
Schwern

@Schwern: จริงgit rev-list --childrenไม่ได้มีไว้สำหรับการแสดงรายชื่อลูก แต่สำหรับผู้ปกครองที่แสดงรายการลูก ๆ ของพวกเขา ... คุณจำเป็นต้องแยกวิเคราะห์
VonC

ฉันลองรหัสนั้นกับเด็กสองคน: $ git children0of 9dd5932 fatal: No annotated tags can describe '71d7b5dd89d241072a0a078ff2c7dfec05d52e1f'. However, there were unannotated tags: try --tags. คุณได้รับผลลัพธ์อะไร
Tom Hale

@ TomHale ฉันไม่สามารถทดสอบได้ในตอนนี้ แต่ถามคำถามใหม่ (กับ OS และ Git เวอร์ชัน) เพื่อให้ทุกคนสามารถทดสอบได้
VonC

1
ปัญหาเดียวของgit-children-ofมันคือมันใช้git อธิบายว่าพยายามจัดรูปแบบ SHA ให้เป็นแบบที่มนุษย์อ่านได้ซึ่งอาจล้มเหลวด้วยข้อผิดพลาดของ @ TomHale และให้ผลลัพธ์เช่นv1.0.4-14-g2414721นั้นทำให้เกิดความสับสนหากคุณคาดว่า SHA การแทนที่ด้วยวิechoทำให้มันเป็นเครื่องมือที่ยอดเยี่ยมขอบคุณ!
Nickolay

18

สิ่งที่ฉันพบคือ

git rev-list --ancestry-path commit1..commit2

ที่ฉันตั้งcommit1เป็นกระทำปัจจุบันและcommit2หัวปัจจุบัน นี้จะส่งกลับรายชื่อของกระทำทั้งหมดที่สร้างเส้นทางระหว่างและcommit1commit2

บรรทัดสุดท้ายของเอาต์พุตคือ child ของ commit1 (บนพา ธ ไปยัง commit2)


3
ดังนั้นเพียงแค่เพิ่ม| tail -1เพื่อรับเด็ก
Jesse Glick

8

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

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

ฉันมาที่คำถามนี้เพราะฉันเพียงแค่ต้องการก้าวไปข้างหน้าในประวัติศาสตร์หนึ่งครั้งกระทำการทดสอบและบางครั้งคุณต้องก้าวไปข้างหน้าและไม่ย้อนกลับ ด้วยความคิดที่มากกว่านี้ฉันคิดวิธีแก้ปัญหานี้ขึ้นมา

เลือกการกระทำก่อนที่คุณจะอยู่ที่ นี่อาจเป็นหัวหน้าสาขา หากคุณอยู่ที่สาขา ~ 10 ให้เลือก "สาขาการชำระเงิน git ~ 9" จากนั้น "สาขาการชำระเงิน git ~ 8" เพื่อรับสิ่งต่อไปจากนั้นจากนั้น "สาขาการชำระเงิน git ~ 7" และอื่น ๆ

การลดจำนวนควรเป็นเรื่องง่ายในสคริปต์ถ้าคุณต้องการ ง่ายกว่าการแยกคำ git rev-list


แม้ว่าจะมีประโยชน์ แต่ก็ไม่พบการกระทำต่อไป มันเดินไปมุ่งมั่นในปัจจุบัน
Schwern

1
ถ้าอย่างนั้นฉันคิดว่าคุณสามารถทำได้: " BRANCH=master; git co $BRANCH~$[ $(git rev-list HEAD..$BRANCH | wc -l) - 1 ]" คุณต้องไปที่สาขาไม่มีทางที่จะไป
vontrapp

8

สองคำตอบในทางปฏิบัติ:

เด็กคนหนึ่ง

ขึ้นอยู่กับ@ คำตอบของไมเคิลผม hacked ขึ้นนามแฝงในของฉันchild.gitconfig

มันทำงานได้ตามที่คาดไว้ในกรณีเริ่มต้นและยังใช้งานได้หลากหลาย

# Get the child commit of the current commit.
# Use $1 instead of 'HEAD' if given. Use $2 instead of curent branch if given.
child = "!bash -c 'git log --format=%H --reverse --ancestry-path ${1:-HEAD}..${2:\"$(git rev-parse --abbrev-ref HEAD)\"} | head -1' -"

มันเป็นค่าเริ่มต้นที่จะให้ลูกของ HEAD (เว้นแต่ว่าจะได้รับอาร์กิวเมนต์ commit-ish อื่น) โดยทำตามขั้นตอนหนึ่งไปยังส่วนปลายของสาขาปัจจุบัน

ใช้%hแทน%Hถ้าคุณต้องการแฮชแบบสั้น

เด็กหลายคน

ด้วย HEAD เดี่ยว (ไม่มีสาขา) หรือให้ลูกทุกคนคำนึงถึงกิ่ง:

# For the current (or specified) commit-ish, get the all children, print the first child 
children = "!bash -c 'c=${1:-HEAD}; set -- $(git rev-list --all --not \"$c\"^@ --children | grep $(git rev-parse \"$c\") ); shift; echo $1' -"

เปลี่ยนเป็น$1เพื่อ$*พิมพ์ลูกทั้งหมด

คุณยังสามารถเปลี่ยน--allเป็น commit-ish เพื่อแสดงเฉพาะเด็กที่เป็นบรรพบุรุษของการกระทำนั้น - กล่าวอีกนัยหนึ่งเพื่อแสดงเฉพาะเด็ก ๆ “ ในทิศทางของ” การกระทำที่ให้ไว้ สิ่งนี้อาจช่วยให้คุณ จำกัด เอาท์พุทจากเด็กหลายคนให้เหลือเพียงหนึ่งเดียว


7

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

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


37
โดยตรรกะนั้นไม่มี "การกระทำก่อนหน้า" อย่างใดอย่างหนึ่ง แต่มีไวยากรณ์มากมายสำหรับการรับผู้ปกครอง
Schwern

7
@Schwern: ไม่มี "การกระทำก่อนหน้า" อย่างใดอย่างหนึ่ง; <rev>^คือ "parent commit" ('ผู้ปกครองคนแรก' สำหรับการรวมการกระทำ)
Jakub Narębski

6

ฉันได้ลองวิธีแก้ปัญหาที่แตกต่างกันไปแล้ว ต้องมากับตัวฉันเอง

ค้นหาความมุ่งมั่นต่อไป

function n() {
    git log --reverse --pretty=%H master | grep -A 1 $(git rev-parse HEAD) | tail -n1 | xargs git checkout
}

ค้นหาการกระทำก่อนหน้า

function p() {
    git checkout HEAD^1
}

6

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

git rev-list --children --all | grep ^${COMMIT}

หากคุณต้องการที่จะเห็นเด็ก ๆและลูกหลานทั้งหมดคุณต้องใช้rev-list --childrenแบบเรียกซ้ำเช่น:

git rev-list --children --all | \
egrep ^\($(git rev-list --children --all | \
           grep ^${COMMIT} | \
           sed 's/ /|/g')\)

(รุ่นที่ให้เฉพาะหลานจะใช้ซับซ้อนsedและ / หรือcut.)

ในที่สุดคุณสามารถป้อนลงในlog --graphคำสั่งเพื่อดูโครงสร้างต้นไม้เช่น:

git log --graph --oneline --decorate \
\^${COMMIT}^@ \
$(git rev-list --children --all | \
  egrep ^\($(git rev-list --children --all | \
             grep ^${COMMIT} | \
             sed 's/ /|/g')\))

หมายเหตุ : คำสั่งข้างต้นทั้งหมดถือว่าคุณได้ตั้งค่าตัวแปรเชลล์${COMMIT}เป็นการอ้างอิงบางอย่าง (branch, tag, sha1) ของการคอมมิทที่ลูกคุณสนใจ


2
นี่ตอบคำถามที่ฉันไม่ทราบวิธีกำหนดสำหรับ google และ stackoverflow แต่พยายามถาม ขอขอบคุณสำหรับการตระหนักถึงความต้องการเชิงรุก
Tommy Knowlton

สำหรับฉัน${COMMIT}ไม่ esist แต่คุณสามารถใช้$(git rev-parse HEAD) แทน
Radon8472

${COMMIT}ขออภัยเพิ่มหมายเหตุเกี่ยวกับ
Matt McHenry

5

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

ลูกศรภายในของ Git ทั้งหมดเป็นทางเดียวชี้ไปทางด้านหลัง ดังนั้นจึงไม่มีไวยากรณ์ที่สะดวกสั้น ๆ สำหรับการย้ายไปข้างหน้า: เป็นไปไม่ได้

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

A <-B <-C <-D <-E   <-- last
        ^
        |
         \--------- middle

ใช้middle~2ต่อไปนี้ลูกศรสองครั้งจากการกลับไปC Aแล้วเราจะย้ายจากCไปยังDอย่างไร คำตอบคือเราเริ่มต้นที่Eใช้ชื่อlastและถอยหลังทำงานจนกว่าเราจะได้รับการmiddle, การบันทึกจุดที่เราแวะไปพร้อมกัน จากนั้นเราก็ย้ายไปเท่าที่เราต้องการในทิศทางของlast: ย้ายขั้นตอนหนึ่งไปหรือสองDE

สิ่งนี้สำคัญอย่างยิ่งเมื่อเรามีสาขา:

          D--E   <-- feature1
         /
...--B--C   <-- master
         \
          F--G   <-- feature2

ซึ่งกระทำการเป็นหนึ่งในขั้นตอนหลังจากที่C? ไม่มีคำตอบที่ถูกต้องจนกว่าคุณจะเพิ่มคำถาม: ในทิศทางของ feature___ (เติมในช่องว่าง)

ในการระบุการกระทำระหว่างC(ไม่รวมC) ตัวเองและ, พูดG, เราใช้:

git rev-list --topo-order --ancestry-path master..feature2

--topo-orderทำให้แน่ใจว่าแม้ในที่ที่มีความซับซ้อนแตกแขนงและผสานการกระทำออกมาเพื่อทอพอโลยีเรียง สิ่งนี้จำเป็นเฉพาะในกรณีที่โซ่ไม่เป็นเชิงเส้น --ancestry-pathจำกัด หมายความว่าเมื่อเราทำงานย้อนกลับจากfeature2เราเท่านั้นที่กระทำรายการที่มีการกระทำCเป็นหนึ่งในบรรพบุรุษของตัวเอง นั่นคือถ้ากราฟ - หรืออันที่เกี่ยวข้องของมัน - จริง ๆ แล้วมีลักษณะเช่นนี้:

A--B--C   <-- master
 \     \
  \     F--G--J   <-- feature2
   \         /
    H-------I   <-- feature3

คำขอที่เรียบง่ายของแบบฟอร์มfeature2..masterระบุกระทำJ, GและIและFและHในการสั่งซื้อบางส่วน ด้วย--ancestry-pathเราเคาะออกHและIพวกเขาไม่ได้เป็นลูกหลานของเพียงของC Aด้วย--topo-orderเราให้แน่ใจว่าการสั่งการแจงนับจริงJแล้วนั้นGF

git rev-listคำสั่งรั่วไหลรหัสกัญชาเหล่านี้ออกจากการส่งออกมาตรฐานของตนต่อหนึ่งบรรทัด หากต้องการเลื่อนไปหนึ่งก้าวไปข้างหน้าตามทิศทางของfeature2เราก็แค่ต้องการบรรทัดสุดท้าย

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

git rev-list --topo-order --ancestry-path --reverse <id1>...<id2> | head -1

เพื่อให้ได้รับ "ส่งมอบครั้งต่อไปในทิศทางของ id2" และมีรายการที่ยาวมากของgit rev-listคำสั่งคำสั่งสามารถรับไปป์ที่ขาดเมื่อพยายามเขียนheadซึ่งหยุดอ่านอินพุตและออก เนื่องจากโดยปกติแล้วเชลล์จะละเว้นข้อผิดพลาดที่ขาดไปจึงมักใช้งานได้ เพียงตรวจสอบให้แน่ใจว่ามันถูกละเว้นในการใช้งานของคุณ

นอกจากนี้ยังดึงดูดให้เพิ่ม-n 1ไปที่คำสั่งพร้อมกับgit rev-list --reverseอย่าทำมัน! ที่ทำให้git rev-listหยุดชะงักหลังจากที่เดินหนึ่งก้าวกลับมาแล้วกลับรายการ (ขาเข้า) ของกระทำเยี่ยมชม ดังนั้นนี่ผลิตออกมา<id2>ทุกครั้ง

ข้อความด้านที่สำคัญ

โปรดทราบว่าด้วยส่วนของกราฟ "diamond" หรือ "benzene ring":

       I--J
      /    \
...--H      M--...  <-- last
      \    /
       K--L

ย้ายหนึ่งกระทำ "ไปข้างหน้า" จากHที่มีต่อlastคุณจะได้รับอย่างใดอย่างหนึ่ง หรือI Kไม่มีอะไรที่คุณสามารถทำได้เกี่ยวกับสิ่งนั้น: การกระทำทั้งสองเป็นขั้นตอนเดียว ถ้าคุณเริ่มจากการกระทำที่เกิดขึ้นและไปอีกขั้นตอนหนึ่งตอนนี้คุณต้องยอมรับว่าคุณเริ่มต้นเส้นทางไหน

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

git rev-list --topo-order --reverse --ancestry-path A..B > /tmp/list-of-commits

จากนั้นไปที่แต่ละการกระทำในรายการนี้ทีละครั้งและคุณจะได้รับห่วงโซ่ทั้งหมด --topo-orderจะให้แน่ใจว่าคุณจะตีIโทโพโลยีJในการสั่งซื้อนั้นและKโทโพโลยีLในลำดับที่ (แม้ว่าจะไม่มีวิธีที่ง่ายต่อการคาดการณ์ว่าคุณจะทำคู่ IJ ก่อนหรือหลังคู่ KL)


" ไม่มีคำตอบที่ถูกต้องจนกว่าคุณจะเพิ่มคำถาม: ในทิศทางของคุณสมบัติ __ " นี่เป็นจุดที่ดีมาก ขอบคุณสำหรับคำตอบ.
Schwern

4

ฉันมีนามแฝงนี้ ~/.gitconfig

first-child = "!f() { git log  --reverse --ancestry-path --pretty=%H $1..${2:-HEAD} | head -1; }; f"

ที่เป็นประโยชน์สำหรับนักพัฒนา Maven
Jesse Glick

คือf()อะไร และมันจะต้องhead -1เป็นลูกคนแรกมิฉะนั้นสิ่งนี้ก็จะรายงานหัว
Xerus

@Xerus เพราะใช้บางคน "ซับซ้อน" f()ไวยากรณ์เปลือกและคอมไพล์จะไม่รู้จักมันถ้าไม่ได้อยู่ในห่อ ใช่head -1เป็นการเดาที่กล้าหาญ
อ่อนแอ

ดี! Tweaked Mine ไปที่: nextref = "!f() { git log --reverse --ancestry-path --pretty=%H $1..HEAD | head -${2:-1} | tail -1; }; f"เพื่อให้คุณสามารถเลือกว่าจะเดินหน้าต่อไปไกลแค่ไหน
Z. Khullah

2

ฉันจัดการเพื่อหาลูกคนถัดไปด้วยวิธีต่อไปนี้:

git log --reverse --children -n1 HEAD (where 'n' is the number of children to show)

1
สำหรับฉันสิ่งนี้แสดงให้เห็นว่าไม่ใช่ลูกคนแรกมันแสดงให้เห็นถึงความมุ่งมั่นในปัจจุบัน
Radon8472

2

หากเด็กกระทำทั้งหมดในบางสาขาคุณสามารถใช้gitk --all commit^..โดยที่ "ยอมรับ" เป็นสิ่งที่ระบุถึงการกระทำ ตัวอย่างเช่นหากการย่อของกระทำ SHA-1 เป็น c6661c5 แล้วพิมพ์gitk --all c6661c5^..

คุณอาจต้องป้อน SHA-1 แบบเต็มลงในเซลล์ "SHA1 ID:" ของ gitk คุณจะต้องใช้ SHA-1 แบบเต็มซึ่งสามารถรับตัวอย่างนี้ได้ทางgit rev-parse c6661c5

อีกทางหนึ่งคือgit rev-list --all --children | grep '^c6661c5883bb53d400ce160a5897610ecedbdc9d'จะสร้างบรรทัดที่มีลูกทั้งหมดของการกระทำนี้สันนิษฐานว่ามีสาขาที่เกี่ยวข้องหรือไม่


0

แต่ละคอมมิชชันเก็บตัวชี้ไปยังพาเรนต์ (พาเรนต์, ในกรณีของการรวม (มาตรฐาน) คอมมิต)

ดังนั้นจึงไม่มีวิธีที่จะชี้ไปที่เด็กที่กระทำ (ถ้ามี) จากผู้ปกครอง


คอมมิทไม่สามารถเก็บพอยน์เตอร์ให้กับลูกของมันได้เนื่องจากคอมมิชชันลูกเพิ่มเติม (จุดการแตกแขนง) สามารถเพิ่มในภายหลัง
Jakub Narębski

@Jakub ฉันไม่ได้ติดตามจริงๆ ไม่สามารถเพิ่มในภายหลังได้
Schwern

1
Jakub: นั่นคือสิ่งที่ฉันพูด 'แต่ละพร็อพเพอร์ตี้เก็บเฉพาะกับพาเรนต์เท่านั้น'
Lakshman Prasad

@Schwern: คอมมิชชันในคอมไพล์ไม่เปลี่ยนรูป (ซึ่งมีผลดีของความรับผิดชอบ), ดังนั้นพอยน์เตอร์ให้กับเด็ก cound't "เพิ่มในภายหลัง" เหตุผลหนึ่งคือตัวระบุการกระทำ (ใช้เช่นในลิงก์ "หลัก") ขึ้นอยู่กับเนื้อหาของ comit; นี่เป็นทางออกเดียวในระบบกระจายโดยไม่มีอำนาจการกำหนดหมายเลขกลาง ด้วย "ลูก" ของการกระทำขึ้นอยู่กับสาขาที่คุณมีและในทางกลับกันอาจแตกต่างจากพื้นที่เก็บข้อมูลไปยังพื้นที่เก็บข้อมูล (และกระทำจะเหมือนกันในแต่ละพื้นที่เก็บข้อมูล)
Jakub Narębski

4
@becomingGuru ฉันลงคะแนนแล้ว อาจเป็นจริง แต่ไม่ตอบคำถามของฉัน คำถามคือ "ฉันจะค้นหาความมุ่งมั่นต่อไปในคอมไพล์ได้อย่างไร" มันไม่ได้ "คอมไพล์กระทำเก็บตัวชี้ไปยังลูก ๆ ของมัน?"
Schwern

0

โพสต์นี้ ( http://www.jayway.com/2015/03/30/using-git-commits-to-drive-a-live-coding-session/#comment-282667 ) แสดงวิธีที่เป็นระเบียบถ้าทำถ้า คุณสามารถสร้างแท็กที่กำหนดไว้อย่างดีในตอนท้ายของสแต็คการกระทำของคุณ เป็นหลักโดย git config --global alias.next '!git checkout `git rev-list HEAD..demo-end | tail -1`' ที่ "demo-end" เป็นแท็กสุดท้าย


0

คำตอบที่มีอยู่สมมติว่าคุณมีสาขาที่มีความมุ่งมั่นที่คุณกำลังมองหา

ในกรณีของฉันความมุ่งมั่นที่ฉันมองหาไม่ได้อยู่ใน git rev-list --allเมื่อไม่มีสาขาอยู่ในนั้น

จบลงด้วยการมองผ่าน gitk --reflogด้วยตนเอง

หากคุณไม่สามารถหาคำสั่งได้แม้จะอยู่ในการอ้างอิงลองด้วย

  • git fsck --full เพื่อแสดงรายการห้อย (กล่าวคือไม่ได้อยู่ในสาขาใด ๆ ) กระทำหรือ
  • git fsck --lost-found เพื่อให้ผู้อ้างอิงชี้ไปทาง dangling มุ่งมั่นที่จะใช้เทคนิคในคำตอบอื่น ๆ
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.