git使用筆記1


查看目前檔案變更狀態
git status
分為已追蹤(tracked)跟尚未追蹤(untracked)

如果是track的檔案有變更,會列在changes not staged for commit底下
如果是新加入的檔案,會列在untracked files,
如果是新加入的目錄,裡面沒檔案則不會列出來,如果裡面有檔案也只會在untracked files列出該資料夾

顯示commit記錄/近5筆記錄/近5筆記錄的指令縮寫
git log 
git log -n 5
git log -5

加入變更/加入所有變更/互動式加入變更,也能夠把untrack的檔案變成track
git add
git add .   #不建議隨意使用跟git add -A類似
git add -i  #互動式加入(路徑太長可以用選的)
互動式加入變更進去之後選2 update,然後把要加入項目前的數字打進去,例如要加入1,7項想加入就打1 7然後

提交變更
git commit -m "version description"
我常常會忘記add再加,雖然git會忽略沒有add的檔案,但是最好先check log再繼續

將新的變更加入到上一次commit的內容中,當然還是得先add
git commit --amend

捨棄所有變更並恢復到最新的commit狀態/前一個commit狀態/往前10個commit的狀態
git reset --hard HEAD
git reset --hard HEAD^
git reset --hard HEAD~10

不捨棄變更, 只是把commit狀態回到前一個狀態
git reset --soft HEAD^

恢復某個檔案到上一次commit的狀態/到上上次的commit的狀態
git checkout -- {filepath}
git checkout HEAD^^ -- {filepath}
git checkout {version-hash-code} -- {filepath}

最近某檔案的詳細變更/最近commit所變更的檔案/看最近commit的變更內容
git log -p
git log --name-only -n 1
git diff HEAD^ HEAD

取消某個檔案的變更,如果原本是untrack file 就會變回, 如果是track就只是變成unstage
git reset HEAD

列出所有local和remote分支

git branch -a

建立分支並切換過去

git checkout -b "branch名"

切換到local分支

git checkout branch名

取得遠端分支並在本地建立同名分支,如果local已存在同名分支會失敗
git checkout -t "遠端分支全名"
遠端分支會像remotes/origin/master

branch改名
git branch -m 舊branch名 新branch名
遠端branch改名只能上傳新的再刪除舊的

本地建立test 分支,並跟隨遠端的remotes/origin/master分支
git checkout -b test -t "remotes/origin/master"

手動追蹤分支
git branch --track experimental origin/experimental
類似git checkout -t "origin/experimental"
主要不同點在於這個branch上的pull跟push都不用再指定來源/目的地是origin
像是git pull experimental

刪除分支,如果分支上有比遠端資料更新的版本就發出警告/強制刪除分支(無法刪除當前所在的分支)
git branch -d
git branch -D

清除遠端分支
git push origin :remotes/origin/test
也就是本地沒指定branch的push方法,就是清除遠端分支

與遠端server更新資料,可以看是否有新的branch或是新版本,不會merge
git fetch

與遠端server取得最新資料並嘗試merge遠端分支的code到目前
git pull
是否亂掉可以用gitk查看左上角的分支線路,不是一條而是有迴圈就是出問題了,得先要恢復到某個版本

有時候branch沒設定好tracking的分支,變成得手動指定pull的位置,origin是遠端伺服器名稱,master是分支
git pull origin master


用gui顯示所有分支的狀態,&是背景執行,這樣才能繼續打command,記得先git fetch才看得到遠端最新的commit
gitk --all&

我很常開分支之後去merge一些commit進來,用gitk可以輕鬆選擇要merge的commit
或者是可以自己手動記錄下要merge的sha1-code然後用cherry-pick

把某個commit的變更套用在目前的版本上,跨branch也可以套用,只差不能跨server
git cherry-pick <版本SHA code>

https://ariejan.net/2010/06/10/cherry-picking-specific-commits-from-another-branch/

列出本地上的一些操作紀錄

git reflog
可以用git reset --hard <版本SHA code>來復原(undo)上一個git指令的操作

匯出最近一次commit的變更到named.path檔案
git format-patch -n1 --stdout > named.path

套用修正檔,如果你的版本有跟patch修改的地方一樣,可能會發生衝突
git am ~/0001-MAJOR-Added-20141021-WfdDec.patch

套用修正檔並顯示套用細節,適合用來查看patch的錯誤訊息
git apply --verbose ~/hd2/revised-wfd.patch
am跟apply都是可以套用修正檔的功能,am是apply from mail

套用git修正檔時會出現一些小warning是關於檔案每行行尾不能有空白,檔案結尾只能有一個空白行,建議是修掉

由於在不同的git repository使用git apply似乎不會正常套用patch,所以我後來都是用patch來套用

patch -p1 < ~/hd2/revised-wfd.patch
如果你套用的目錄有差異,就需要用-p是指定忽略patch內寫的目錄層數

一般來說用git diif或git format-patch產生出來的patch檔案會多一層目錄diff a/device/xxxx.mk b/device/xxxx.mk
所以需要請patch忽略第一層目錄

產生兩個檔案/目錄差異的git patch
git diff old/ new/ > diff.patch

使用編輯器快速整理目前分支的commit
git rebase -i

於上面指令所指定的commit並不會被列在編輯器裏面,所以我一般會加上^來讓指定的commit也被包含在內

git rebase -i {sha1sum}^

一般的commit前面會帶pick / p
要修改commit名稱的要改成reword / r
要和前一個commit合併的要改成 fix / f
要和前一個commit合併並修改commit內容要改成 s
如果是要移除commit就是刪除該行

如果完成修改就存檔並離開編輯器,然後就會開始執行重整。
如果沒存檔的話就整個重新pick,雖然commit內容會相同,但是會和目前branch不一樣,這個原因是commit內的修改人和修改時間會變更。

重整做到一半如果有衝突發生就會需要自己處理,git status 會顯示有衝突的部份,修改後要用git add加入,然後在依照git status 上的指示打git commit,然後就會自動帶入目前的commit的描述。不過請記得! 如果你解決衝突後的檔案和目前的commit沒有差異,就沒有辦法commit

另外有時候要git rebase --continue;如果打算中途停止重整,請按下Ctrl+C中斷重整程序,並打git rebase --abort還原到重整之前的狀態。

顯示某檔案的git sha1sum

git hash-object {filepath}

留言