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^
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名
git checkout -t "遠端分支全名"
git branch -m 舊branch名 新
branch名
遠端branch改名只能上傳新的再刪除舊的
本地建立test 分支,並跟隨遠端的remotes/origin/master分支
git checkout -b test -t "remotes/origin/master"
手動追蹤分支
類似git checkout -t "origin/experimental"
主要不同點在於這個branch上的pull跟push都不用再指定來源/目的地是origin
像是git pull experimental
刪除分支,如果分支上有比遠端資料更新的版本就發出警告/強制刪除分支(無法刪除當前所在的分支)
git branch --track experimental origin/experimental
主要不同點在於這個branch上的pull跟push都不用再指定來源/目的地是origin
像是git pull experimental
刪除分支,如果分支上有比遠端資料更新的版本就發出警告/強制刪除分支(無法刪除當前所在的分支)
git branch -d
git branch -D
清除遠端分支
git push origin :
remotes/origin/test
與遠端server更新資料,可以看是否有新的branch或是新版本,不會merge
git fetch
git pull
有時候branch沒設定好tracking的分支,變成得手動指定pull的位置,origin是遠端伺服器名稱,master是分支
git pull origin master
用gui顯示所有分支的狀態,&是背景執行,這樣才能繼續打command,記得先git fetch才看得到遠端最新的commit
gitk --all&
或者是可以自己手動記錄下要merge的sha1-code然後用cherry-pick
把某個commit的變更套用在目前的版本上,跨branch也可以套用,只差不能跨server
git cherry-pick <版本SHA code>
列出本地上的一些操作紀錄
git reflog
可以用git reset --hard <版本SHA code>來復原(undo)上一個git指令的操作
git format-patch -n1 --stdout > named.path
套用修正檔,如果你的版本有跟patch修改的地方一樣,可能會發生衝突
git am ~/0001-MAJOR-Added-20141021-WfdDec.patch
套用修正檔並顯示套用細節,適合用來查看patch的錯誤訊息
git apply --verbose ~/hd2/revised-wfd.patch
套用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}
留言