git學習之二 - commit講解、reset復原版本、建立分支

作者 KueiKuei 日期 2018-02-07
Git
git學習之二 - commit講解、reset復原版本、建立分支


主題

  • commit講解
  • 檔案在 git 底下的四種狀態
  • git reset||commit –amend復原版本
  • 建立分支(branch)
  • 參考資料

commit講解

一個 commit 在 Git 中就是一個節點,這些 commit的節點就是未來你可以回朔及追蹤的參考,你可以想像就像是電玩遊戲時的存檔每一個 commit 是一次存檔,讓我們未來在需要的時候都可以回到這些存檔時的狀態。

git與github的第一步
我們以第一個commit做了一個完整的流程
然而其中的git addgit commit的意思卻不甚了解
這次我們來好好研究其

檔案在 git 底下的四種狀態

File Status LifeCycle

  1. untracked - 未追蹤的,代表尚未被加入 Git 儲存庫的檔案狀態
  2. staged - 暫存區,只有放在裡頭的檔案才能進行commit,代表下次執行git commit會將這些檔案全部送入儲存庫。新檔案透過git add後的狀態。
  3. modified - 已修改的,代表檔案已經被編輯過,或是檔案內容與上一個版本內容是不一致的狀態。

  4. unmodified - 未修改的,代表檔案第一次被加入,或是檔案內容上一個版本內容是 一致的狀態

流程整理:
修改檔案(edit) => 加入 staged (git add) => 提交(git commit)=> 繼續修改其他檔案

至於要如何查看檔案狀態呢?

//查看工作目錄的狀態時...
$git status

//或是看更精簡一點的狀態...
$git status -s

關於git add
就是把untracked 或是 modified 狀態下的檔案改成 staged 的狀態 (等待被 commit 的版本)。

git add .
.代表這個路徑底下的所有檔案
今天你若不想把路徑下所有的檔案都變成 staged 狀態
git add 你要改成 staged 狀態的檔名

假若想把檔案狀態從staged轉成modified該如何調整?
答:

$git reset HEAD 'file_name'

git reset||commit –amend復原版本

取消已經暫存的(git add)檔案

$git reset HEAD 'file_name'

取消對檔案的修改(edit)

$git checkout -- 'file_name'

在還沒有git add 'file_name'的情況下使用指令。
此時回去看程式碼
發現已經修復回原本
請注意
這指令有些危險,針對該檔案的修改都沒有了,因為我們剛剛把之前版本的檔案複製過來覆蓋了此檔案。所以在用這指令前,請務必確定真的不再需要剛剛的修改。

恢復 Commit,重新提交 Commit
假如您想要修改 commit 訊息,或者是尚未修改好檔案

$git reset --soft HEAD\^

--soft 代表銷毀 commit 但是保留 commit 內容
\為跳脫字元,加上後mac的指令才能跑
HEAD^ 代表上一個 commit (版本)
再commit一次想要輸入的message即可
簡單來說reset soft會銷毀 commit 又再重新 commit

第二種方法
commit --amend

$git add 'file_name'
$git commit --amend

--amend 是指重新修改上一個 commit
提交時,預設的編輯器會出現,裡面會包含上一次提交的訊息內容。

如果懶得更改commit message
則打入

$git commit --amend --no-edit

--no-edit 則是代表不會修改 commit message

強制恢復到上一版本(commit)
謹慎小心此方法
因為會將原來版本強行砍掉

$git reset --hard HEAD\^

想要回到多個版本之前

$git reset --hard HEAD~'num'

觀念複習與比較

//取消上一個 commit,但是保有 commit 內容
$git reset --soft HEAD^

//取消上一個 commit,並且刪除 commit 內容
$git reset --hard HEAD^

//將工作目錄現有的編輯合併到上一個版本
$git commit --amend

建立分支(branch)

在 git 的世界裡,分支 (branch) 是很重要的概念
簡單來說,分支就像是你的程式碼的平行世界
你可能在一個分支上搞砸了,但是不會影響到另一個分支的程式碼

建立完分支後需要切換到該分支才能開始作業

//創立新的分支
$git branch 新分支名稱

//切換到該分支:
$git checkout 新分支名稱

//回到主支
$git checkout master

#####git reset –soft HEAD^
推到雲端時不被接受

####git push origin master –force
強行毀掉遠端的commit存入local的commit

不破壞原本commit並進行現存commit的更改

#####git commit –amend
原本commit的其他功能
$ git commit –amend –no-edit
推到雲端時仍不被接受
原因:即便是同一個commit但是內容不同仍然不給上傳
git push origin master –force

參考資料

Git 版本控制:利用 git reset 恢復檔案、暫存狀態、commit 訊息

教學3 改寫提交 Commit –amend