以下內容有:
修改git記錄/追加檔案到最近一次的commit上
新增目錄/把檔案放在.gitignore裡
檢視特定檔案的commit紀錄
找出每一行程式碼的author
救回檔案或目錄
使用 — hard模式,仍能將commit找回來/reflog-git紀錄
HEAD是什麼?/只commit一個檔案中的一些內容
修改git記錄
有四種:
1. 直接把.git刪除
2. 使用git rebase來更改
3. 先把commit用git reset拆掉,再commit
4. 使用 — amend參數,來修改“最後一次”的commit
・使用 — amend
如最後一次的commit message是wtf,使用git和 — amend更改。
git commit —-amend -m "Update agian"
git log如果沒有使用-m加上後面的訊息,就會出現vim視窗
另外,因為commit訊息更改,所以產生新的SHA-1
・使用git rebase
git log --oneline
如出現ji69y3 — (3) — oje89si
git rebase -i oje89si
-i是進入互動模式、此句意思是由目前(最後一個commit ji69y3)到(最先的commit oje89si),共有五個commit。
此時會出現vim介面
將要修改的commit前面的pick改為reword,然後存檔離開後,會出現新的vim編輯器,把內容改為"想更改的名稱",存檔離開就可以了!
*如果要改回更改前的內容的話:git reset ORIG_HEAD --hard
*請記得修改完再push,不要push完再修改!
・將先前的commit拆掉重做/reset模式
git log — onelinee12d8ef (HEAD -> master) add database.yml in config folder
85e7e30 add hello
657fce7 add container
abb4f43 update index page
cef6e40 create index page
cc797cd init commit
如果想拆掉最後一次的commit,可以使用「相對」或「絕對」的做法。「相對」可以這樣做:
git reset e12d8ef^(^表示前一個,^^表示前兩個,也可以用~2表示)
而因為此時master和head都指向e12d8df這個commit上,所以可以改寫為
git reset HEAD^ || git reset master^如果非常清楚要reset的commit是哪一個,則使用「絕對」:
git reset 85e7e30(拆掉85e7e730)
拆掉的commit去了哪裡?跟reset模式有關,共有三種模式 — mixed/ — soft/ — hard
--mixed為預設模式,若git reset後面沒有接參數,則會直接使用這個。這個模式會將暫存區的檔案丟掉,但不會動到工作目錄的檔案,也就是說commit拆出來的檔案會留在工作目錄裡,但不會留在暫存區裡。--soft模式,工作目錄與暫存區的檔案都不會被丟掉,看起來指示HEAD的移動而已。commit拆出來的檔案會放在暫存區。--hard模式,工作目錄與暫存區都會被丟掉。
*commit丟掉之後,可以反悔!(看下一篇)
*再git裡的reset意思是「前往」或「變成」,不是一般以為的「重新設定」。
*使用git reset HEAD^(意思是:我要前往兩個commit之前的狀態)
*使用reset不會真的被拆掉,commit其實都還在。看起來不見的東西只是暫時看不到,但隨時都能再撿回來!
追加檔案到最近一次的commit上
有兩種:
1. 使用git reset把最後一次的commit拆掉,加入新檔後再commit回去
2. 使用 — amend
・使用 — amend
commit完後,發現想再追加一個檔案上去,但又不想再創建一個新的commit。
touch index.html
git status(index.html => untracked)
git add index.html(將index.html加到暫存區)
git commit —-amend --no-edit(--no-edit表示不編輯commit訊息)
新增目錄
git status(空的目錄)
mkdir images(創建新的檔案images)
git status(仍為空的,為何?)
*git 在計算、產生物件時,是根據“檔案的內容”去做計算!
[solve]:
在新檔案images先加上一個file,如不知道要用什麼,可以使用
touch images/.keep(.keep||.gitkeep)
讓git感應到檔案的存在。然後git status確認狀態,就可以commit了!
把檔案放在.gitignore裡
如機密檔案
在專案目錄裡創建一個.gitignore,然後加入想忽略的檔案名。
touch .gitignore
*此時創建加入.gitignore下的檔名,或修改檔案內容,再使用git status都不會有更改出現。
*只要.gitignore存在,即使這個檔案沒有被commit或push上Git Server都有效。但這個檔案建議commit並push上專案,這樣協作的人才能同步。
*使用git add -f 檔案名,則可忽略git的忽略功能,而有修改記錄。
*修改config/database.yml後,再git status,會發現有修改記錄,是因為.gitignore創建在database.yml之後。
[solve]:
git rm --cached(將.gitignore之前設置的檔案,不再tracked),就可以了。一口氣清除被忽略的檔案:
git clear -fX(-指強制刪除,X為大寫!!!)
檢視特定檔案的commit紀錄
git log(看全部)
git log new.html(只看new.html)
git log -p new.html(看new.html修改地方的全部訊息)
找出每一行程式碼的author
使用git blame
git blame new.html
若是檔案太多,可以使用-L顯示特定幾行
git blame -L 5,10 new.html(顯示五到十行的程式碼)
救回檔案或目錄
rm *.html(刪除.html的所有檔案)
git status(可以看到被刪除的所有檔案)救回單一檔案:
使用git checkout 檔案名
git checkout new.html(救回new.html檔案)
ls -al(查看所有檔案)救回所有檔案
git checkout .
ls -al
git checkout有兩種意思。當接“分支名稱”時,則表示切換到指定的分支上。若接”檔名或路徑“,則是把檔案從.git目錄裡拉一份到目前工作的目錄上。
更精確的說,這個指令會將檔案從暫存區(staging area)裡的內容或檔案,拿來覆蓋工作目錄(working directory)的內容或檔案。
所以上面使用git checkout kay.html或是git checkout .,他會把new.html或當下目錄所有檔案,回覆到上一個commit狀態。
git checkout HEAD~2 new.html
表示將距離現在兩個之前的版本,覆蓋在目前的工作目錄裡的new.html檔案,要注意的是,這同時也會更改暫存區的狀態!
git checkout HEAD~2 .
表示拿距離現在兩個之前的版本,覆蓋在目前的工作目錄上!
使用 — hard模式,仍能將commit找回來/reflog-git紀錄
git log --oneline
git reset HEAD~2(回到距最後一個commit的前兩個commit狀態上)
git log --oneline(少兩個commit)
再使用
git reset e12d8ef --hard(回到最後一個commit e12d8ef,拆掉的commit又回來了)
*這裡使用 — hard,可以強迫放棄reset之後修改的檔案。
如果一開始沒有記下最後一次commit的SHA-1,可以使用reflog看到一些記錄。
git reset HEAD~2 --hard(直接切換到距離最後一次commit前的兩個commit上)
git reflog
/ — -
$ git reflog
657fce7 (HEAD -> master) HEAD@{0}: reset: moving to HEAD~2
e12d8ef (origin/master, origin/HEAD, cat) HEAD@{1}: checkout: moving from cat to master
e12d8ef (origin/master, origin/HEAD, cat) HEAD@{2}: checkout: moving from master to cat
— -/
使用git reset e12d8ef --hard(就可以把最後一個commit拿回來了!)
*git log加上-g也可以看到reflog喔!
HEAD是什麼?
cat .git/HEAD(顯示ref : refs/heads/master)
cat .git/refs/heads/master(顯示40字元的檔案)
git branch(顯示所有的分支)
git checkout new(切換至new的分支上)
此時再用cat .git/HEAD(則會顯示:ref: refs/heads/new)
*在切換分支時,除了HEAD的內容會改變外,reflog也會有紀錄。
只commit一個檔案中的一些內容
git add -p new.html(跑出vim視窗,y-全部加入,e-可挑選特定句子)
新的vim視窗出現後,按i(進入insert狀態),刪除不想add上去的句子,esc離開insert狀態,:wq儲存並離開