[GIT] Tips & 碎碎念

Posted on 週二 19 一月 2016 in Archive

終於有時間把這一兩個月參與Project遇到的小問題&解法紀錄下來啦(淚

Conflict of binary files

在merge or rebase的時候 當Project裡面有一些prebuilt lib之類的東西conflict的時候 就要手動solve......都已經變binary了無法手動選自己需要的feature啦ˊ_>ˋ 只好二選一,不是你的就是我的

# 選擇merge來源的
git checkout --theirs [binary file name]

# 選擇原本branch的
git checkout --ours [binary file name]

git add [binary file name]

# add & commit if doing merge
git commit

# continue if doing rebase
git rebase --continue

修改上一個Commit message or 多加修改內容

有時候實在會腦殘忘記要多改什麼東西 or 眼殘忘記add哪個改好的file 但相對應的內容的commit進去了 這個時候就可以用--amend這個參數:

git add [some thing u forgot to add :P]
git commit --amend
# Use editor edit commit msg

這樣就不會多一個新的commit,而是拿上次的commit內容再重新commit一次 也因為這樣commit的SHA1會改變 意思是說,如果之前的commit已經上傳到remote的話就沒救啦XDDD 想要push上去會一直被reject QQ 這個時候就只好回復到remote的版本,再乖乖多加一個commit啦

# 回到上一個commit,並把修改的東西pop到working tree
git reset HEAD^

# save your new changes
git stash

# 完全回復到這個commit, 之後fast forward才不會掛掉
git reset --hard HEAD && git clean -df
git merge [your remote]/[corresponding branch]

# 把新修改的pop出來
git stash pop

# 重新commit...

清除所有untracked files

解決上一個問題所發現的新招 :P

git clean -df

# 包含回復.gitignore的話:
git clean -dfx

Rebase 多個conflict

有時候開branch自己開心的開發完,想要rebase回去比較漂亮的時候 就會發現master也改到你的東西啦 如果想要以master為準的話 就會發現每rebase continue一次就要手動solve一次conflict............ 這個時候除了乖乖用merge以外 也可以用squash把多個commit合併,這樣只要solve一次就可以了

git rebase -i master

# in vim
squash SHA1_1 your_first_commit
squash SHA1_2 your_second_commit
...
pick SHA1 your_last_commit

不過這麼作的話就會把很多不相關的commit都打包在一起 :/ 所以比較厚工的作法就是rebase到不會出現conflict的地方 再將master rebase到該branch上 必要的時候可能還要先整理一下master branch :/

# at branch dev
git rebase --onto [SHA1 of the commit]
git checkout master
git rebase dev

應該還有更漂亮的解決方法 不過重點是要盡量避開這種狀況 : P