Dangit, Git!?!

גיט זה קשה: קל מאוד לפשל, ולהבין איך לתקן את הטעויות שלך זה פשוט בלתי אפשרי. התיעוד של גיט סובל מבעיית הביצה והתרנגולת בה אתה לא יכול לחפש כיצד להוציא את עצמך מהבלאגן, אלא אם כן אתה כבר יודע את השם של הדבר שעלייך לדעת מראש כדי לתקן את הבעיה שלך.

אז הנה כמה מצבים גרועים שהגעתי אליהם, ואיך בסופו של דבר הוצאתי את עצמי מהם בעברית פשוטה.

אוי לעזאזל, עשיתי משהו ממש גרוע, בבקשה תגיד לי שלגיט יש מכונת זמן קסומה!?!

git reflog
# אתם תראו רשימה של כל הדברים
# אשר עשיתם, בכל הברנצ'ים השונים!
# לכל אחד מהם יש אינדקס - HEAD@{index}
# תמצא את האחד לפני ששברת הכל
git reset HEAD@{index}
# מכונת זמן קסומה.

אתה יכול להשתמש בזה כדי להחזיר דברים שמחקת בטעות, או רק כדי להסיר כמה דברים שניסית ששברו את הריפו, או לשחזר לאחר מרג' גרוע, או סתם כדי לחזור לתקופה בה הדברים באמת עבדו. אני משתמש הרבה בreflog. תודה להרבה הרבה אנשים שהציעו להוסיף את זה!

אוי לעזאזל, עשיתי קומיט ואז הבנתי שאני צריך לעשות עוד שינוי קטן!

# בצע את השינוי
git add . # או הוסף קבצים בודדים
git commit --amend --no-edit
# עכשיו הקומיט האחרון שלך מכיל את השינויים!
# אזהרה: לעולם אל תשנה קומיטים פומביים

זה בד"כ קורה לי כאשר אני עושה קומיט ולאחר מכן מריץ טסטים או לינטר.... ואוי לא. לא שמתי רווח אחרי סימן השווה. אתם יכולים לעשות את השינוי כקומיט חדש ואז להריץ: rebase -i על מנת לאחד את שניהם ביחד, אבל זה פי מיליון מהיר יותר.

אזהרה: לעולם אל תשנה קומיטים פומביים \ מברנץ' משותף! תשנה רק כאלו שקיימים אצלך מקומית אחרת אתה הולך לסבול.

אוי לעזאזל, אני צריך לשנות את ההודעה בקומיט האחרון שלי!

git commit --amend
# עקוב אחר ההנחיות על מנת לשנות את הקומיט

דרישות עיצוב מטומטמות.

אוי לעזאזל, בטעות עשיתי קומיט למאסטר במקום לברנץ' חדש!

# צור ברנץ' חדש מהמצב הנוכחי של המאסטר
git branch some-new-branch-name
# מחק את הקומיט האחרון מהמאסטר
git reset HEAD~ --hard
git checkout some-new-branch-name
# הקומיט שלך חי בברנץ' הזה עכשיו :)

הערה: זה לא עובד במקרה שדחפת את הקומיט לברנץ' פומבי \ משותף, ובמידה וניסת דברים לפני כן, אולי תצטרך להריץ git reset HEAD@{number-of-commits-back} במקום HEAD~. ממש עצוב. בנוסף, המון המון המון אנשים הציעו דרך קצרה יותר לעשות את זה שלא הכרתי בעצמי. תודה רבה לכולכם!

אוי לעזאזל, בטעות עשיתי קומיט לברנץ' הלא נכון!

# בטל את הקומיט האחרון, אבל השאר את השינוי
git reset HEAD~ --soft
git stash
# עבור אל הברנץ' הנכון
git checkout name-of-the-correct-branch
git stash pop
git add . # או הוסף קבצים בודדים
git commit -m "ההודעה שלך פה";
# עכשיו השינוים שלך בברנץ' הנכון.

המון אנשים הציעו להשתמש ב cherry-pick בסיטואציה הזו, אז בחר את מה שאתה חושב שהכי הגיוני.

git checkout name-of-the-correct-branch
# העתק את הקומיט האחרון למאסטר
git cherry-pick master
# מחק אותו מהמאסטר
git checkout master
git reset HEAD~ --hard

אוי לעזאזל, ניסתי להריץ diff אבל שום דבר לא קרה?!?

אם אתה יודע שעשית שינוי לקבצים אבל `diff` ריק, ככל הנראה הוספת את הקבצים אל ה staging ואתה צריך להשתמש בדגל מיוחד.
git diff --staged

¯\_(ツ)_/¯ (כן אני יודע, זה פיצ'ר לא באג, אבל זה ממש מעצבן ולא ברור מאליו בפעם הראשונה שזה קורה לך!)

אוי לעזאזל, אני צריך לבטל קומיט מלפני איזה 5 קומיטים!

# מצא את הקומיט שאתה צריך לבטל
git log
# השתמש בחצים על מנת לנווט בהיסטוריה
# ברגע שמצאת את הקומיט, שמור את ההאש
git revert [ההאש השמור]
# גיט יצור קומיט חדש שיבטל את הקומיט הקודם
# עקוב אחר השלבים על מנת לבטל את הודעת הקומיט 
# או שפשוט שמור

מסתבר שאתה לא צריך לאתר את ההתוכן הישן ולהעתיק אותו לקבצים החדשים על מנת לבטל שינויים! אם עשית קומיט לבאג, אתה יכול לבטל הכל בפעם אחת בעזרת revert.

בנוסף, אתה יכול לשחזר קובץ אחד במקום את כל הקומיט! אבל כמובן, בשפה של גיט, זה סט פקודות שונה לחלוטין....

אוי לעזאזל, אני צריך לבטל שינוים לקובץ!

# מצא את האש לפני שינוי הקובץ
git log
# התשמש בחצים לנווט
# ברגע שמצאת את הקומיט, שמור את ההאש.
git checkout [ההאש השמור] -- path/to/file
# הגרסא הקודמת של הקובץ יהיה באינדקס שלך
git commit -m "ואו, לא צריך להעתיק ולהדביק בשביל לבטל"

כאשר סוף סוף הבנתי את זה זה היה ענק! ע-נ-ק. אבל ברצינות, באיזה יקום הגיוני להתשמש ב checkout -- לבטל שינוי לקובץ? :נענוע-אגרופים-לכיוון-לינוס-טורבאלדס:

שכח מהרעש הזה. אני מוותר

cd ..
sudo rm -r stupid-git-repo-dir
git clone https://some.github.url/stupid-git-repo-dir.git
cd stupid-git-repo-dir
תודה ל Eric V. על זה. כל תלונה על שימוש ב `sudo` בבדיחה הזו אפשר להפנות אליו.

וברצינות, אם הרבנץ' שלך לגמריייי שבור עד כדי כך שאתה צריך לאפס את הברנץ' שלך להיות זהה לברנץ' המרוחק בדרך ה "git-approved", נסה את זה, אבל הזהר - זוהי פעולה הרסנית ובלתי הפיכה.

# קבל את המצב האחרון
git fetch origin
git checkout master
git reset --hard origin/master
# מחק קבצים ותיקיות אשר גיט לא עוקב אחריהם
git clean -d --force
# בצע checkout/reset/clean על כל ברנץ' שבור

* הצהרה: אתר זה אינו מיועד להיות מקור סימוכין, וכן, ישנן דרכים אחרות לעשות את אותם הדברים בצורה תיאורטית יותר או פחות, אך הגעתי לשלבים האלו באמצעות ניסוי וטעייה והרבה קללות. היה לי את הרעיון המטורף הזה לשתף אותם במינון בריא של קלות ראש. קח את זה, או הנח לזה!

תודה רבה לכל מי שעזר לתרגם את האתר הזה לשפות השונות, אתם אלופים! Michael Botha (af) · Khaja Md Sher E Alam (bn) · Eduard Tomek (cs) · Moritz Stückler (de) · Franco Fantini (es) · Hamid Moheb (fa) · Senja Jarva (fi) · Michel (fr) · Alex Tzimas (gr) · Elad Leev (he) · Aryan Sarkar (hi) · Ricky Gultom (id) · fedemcmac (it) · Meiko Hori (ja) · Zhunisali Shanabek (kk) · Gyeongjae Choi (ko) · Rahul Dahal (ne) · Martijn ten Heuvel (nl) · Łukasz Wójcik (pl) · Davi Alexandre (pt_BR) · Catalina Focsa (ro) · Daniil Golubev (ru) · Nemanja Vasić (sr) · Björn Söderqvist (sv) · Kitt Tientanopajai (th) · Taha Paksu (tr) · Andriy Sultanov (ua) · Tao Jiayuan (zh) . בעזרת עזרה נוספת מ Allie Jones · Artem Vorotnikov · David Fyffe · Frank Taillandier · Iain Murray · Lucas Larson · Myrzabek Azil

אם ברצונך לעזור ולתרגם את זה לשפה נוספת, שלח PR ל GitHub