Oh Shit, 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 fucking-git-repo-dir
git clone https://some.github.url/fucking-git-repo-dir.git
cd fucking-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 על כל ברנץ' שבור

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

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

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