git筆記,git學習筆記
這篇有關git的部落格,寫著寫著有些崩了。裡面有些碎碎念了。下次一定注意這個問題。
建立項目:
- midir xx :建立xx檔案夾
- git init : 為當前檔案夾建立代碼倉庫
提交代碼:
- git add xx : 將檔案名稱為xx的檔案暫存起來,當commit的時候就提交到代碼倉庫
- git commit -m "xx" : 為當前提交添加描述
檢查狀態:
- git status : 檢查當前倉庫的狀態,即查看是否存在未提交的新檔案
- git log : 查看更改清單
單行曆史
你可以很好的控制處理 log
命令要精確顯示的內容。我喜歡 單行格式:
$ git log --pretty=oneline
你應該看到:
$ git log --pretty=oneline1f7ec5eaa8f37c2770dae3b984c55a1531fcc9e7 Added a comment582495ae59ca91bca156a3372a72f88f6261698b Added a default value323e28d99a07d404c04f27eb6e415d4b8ab1d615 Using ARGV94164160adf8faa3119b409fcfcd13d0a0eb8020 First Commit
控制顯示哪個條目
log
命令有許多選項用來選擇顯示哪個條目。玩玩下面的選 項:
$ git log --pretty=oneline --max-count=2$ git log --pretty=oneline --since='5 minutes ago'$ git log --pretty=oneline --until='5 minutes ago'$ git log --pretty=oneline --author=<your name>$ git log --pretty=oneline --all
參閱 man git-log
瞭解更多細節。
更加漂亮
這是我用來複查上周所做更改的命令。如果我只想看自己所 作的更改,那麼我將添加--author=jim
。
$ git log --all --pretty=format:'%h %cd %s (%an)' --since='7 days ago'
終極日誌格式
隨著時間的推移,我發現在工作時最喜歡下列日誌格式。
$ git log --pretty=format:'%h %ad | %s%d [%an]' --graph --date=short'
它看起來像這樣:
$ git log --pretty=format:'%h %ad | %s%d [%an]' --graph --date=short* 1f7ec5e 2013-04-13 | Added a comment (HEAD, master) [Jim Weirich]* 582495a 2013-04-13 | Added a default value [Jim Weirich]* 323e28d 2013-04-13 | Using ARGV [Jim Weirich]* 9416416 2013-04-13 | First Commit [Jim Weirich]
讓我們看一下細節:
--pretty="..."
定義輸出的格式
%h
是提交 hash 的縮寫
%d
是提交的裝飾(如分支頭或標籤)
%ad
是創作日期
%s
是注釋
%an
是作者姓名
--graph
使用 ASCII 圖形布局顯示提交樹
--date=short
保留日期格式更好且更短
擷取舊版本:
- git checkout <hash> :檢查日誌輸出,並且找到hash對應的提交,和下面的配合,能看到這次提交的改變
- cat 檔案名稱 : 如 hello.rb
- git checkout master : 返回最新的版本
為版本打標籤
- git tag xx : 為目前的版本打上標籤XX, 如 git tag v1
標記先前的版本======》通過上面的方法擷取舊版本,然後再為目前的版本打標籤。
去除標籤:
撤銷更改:(這裡都以hello.rb檔案為例)
@處理之前確定你在master的最新提交上===》 git checkout master ;
@檢查狀態,確定更改的內容沒有緩衝,更沒有提交,屬於撤銷本地更改===》 git status;
@使用checkout命令檢出更改的檔案,在倉庫中的版本,以hello.rb檔案為例
$ git checkout hello.rb //這句就撤銷了本地更改,下面兩句是查看 hello.rb 的內容$ git status$ cat hello.rb
2.撤銷緩衝更改
@檢查狀態,確定更改的內容已經緩衝,但沒有提交,屬於撤銷緩衝更改===》 git status;
@清空暫存區內容===》git reset HEAD hello.rb
@使用checkout命令檢出提交的版本(即上一次提交的內容)===》git checkout hello.rb
3.撤銷提交的更改
@使用建立一個提交來移除由不想 要的提交所引入的更改===》git reset HEAD
@上面的語句將進入編輯器,你可以編輯預設的提交資訊,或直接 離開它。儲存並關閉檔案。會看到:
$ git revert HEAD[master f98cb24] Revert "third commit" 1 file changed, 1 insertion(+), 3 deletions(-)
@第二步就已經成功了,此時讓我們來查看提交記錄(這裡的git hist 是自己定義的命令,可以用git log 查看):
$ git hist* f98cb24 2016-04-04 | Revert "third commit" (HEAD -> master) [mecury]* da6b209 2016-04-04 | third commit [mecury]* d44641b 2016-04-04 | second commit (tag: v1) [mecury]* 46de4a5 2016-04-04 | First Commit (tag: v1-beta) [mecury]
重設分支:
首先,標記分支
但在我們移除提交前,讓我們使用一個標籤來標記最新的提 交以便能夠再次找到它。
$ git tag oops
重設到 Oops 前
看看上面的日誌曆史,我們將知道標記為“v1”的提交是錯誤 提交之前的正確提交。讓我們重設分支到該位置。因為分支 已經標記,所以我們可以在 reset
命令中使用標籤名( 如果它沒有被標記,那麼我們只能使用雜湊值)。
$ git reset --hard v1$ git hist
$ git reset --hard v1HEAD is now at 1f7ec5e Added a comment$ git hist* 1f7ec5e 2013-04-13 | Added a comment (HEAD, v1, master) [Jim Weirich]* 582495a 2013-04-13 | Added a default value (v1-beta) [Jim Weirich]* 323e28d 2013-04-13 | Using ARGV [Jim Weirich]* 9416416 2013-04-13 | First Commit [Jim Weirich]
我們的 master 分支現在指到 v1 提交,並且 Oops 和 Revert Oops 提 交已經不在分支中。--hard
參數表示應當更新工作目錄以便與新的分 支頭保持一致。
什麼也沒丟
但錯誤的提交發生了什嗎?結果是提交仍然在倉庫中。事實上,我們仍然 能夠引用它們。記得在本實驗開始我們使用標籤“oops”標記了還原的提交。 讓我們看看所有的提交。
$ git hist --all
$ git hist --all* a10293f 2013-04-13 | Revert "Oops, we didn't want this commit" (oops) [Jim Weirich]* 838742c 2013-04-13 | Oops, we didn't want this commit [Jim Weirich]* 1f7ec5e 2013-04-13 | Added a comment (HEAD, v1, master) [Jim Weirich]* 582495a 2013-04-13 | Added a default value (v1-beta) [Jim Weirich]* 323e28d 2013-04-13 | Using ARGV [Jim Weirich]* 9416416 2013-04-13 | First Commit [Jim Weirich]
在這兒我們看到錯誤的提交並沒有消失。它們仍然在倉庫中。它們只是不再 列到 master 分支中。如果我們沒有標記它們,它們依然在倉庫中,但除了 使用雜湊值外沒有別的方法引用它們。未引用的提交保留在倉庫中,一直到 系統運行記憶體回收軟體時。
修正提交:
更改程式並提交
給程式添加作者注釋。
# Default is World# Author: Jim Weirichname = ARGV.first || "World"puts "Hello, #{name}!"
$ git add hello.rb$ git commit -m "Add an author comment"
唉,該有 Email 啊
在你做了提交之後,你意識到任何好的作者注釋都應該包含 Email 地址。更新 hello 程式來包含 Email。
# Default is World# Author: Jim Weirich (jim@somewhere.com)name = ARGV.first || "World"puts "Hello, #{name}!"
修正先前的提交
我們真的不想因為 Email 而分開提交。讓我們修正先前的提交 來包含 Email 更改。
$ git add hello.rb$ git commit --amend -m "Add an author/email comment"
$ git add hello.rb$ git commit --amend -m "Add an author/email comment"[master eb30103] Add an author/email comment 1 files changed, 2 insertions(+), 1 deletions(-)
回顧曆史
$ git hist
$ git hist* eb30103 2013-04-13 | Add an author/email comment (HEAD, master) [Jim Weirich]* 1f7ec5e 2013-04-13 | Added a comment (v1) [Jim Weirich]* 582495a 2013-04-13 | Added a default value (v1-beta) [Jim Weirich]* 323e28d 2013-04-13 | Using ARGV [Jim Weirich]* 9416416 2013-04-13 | First Commit [Jim Weirich]
我們可以看到最初的“author”提交現在消失了,而且它已經 被“author/email”提交替換。通過重設分支到某個提交並重 新提交新的更改,你可以實現相同的效果。
移動檔案:
- mkdir xx : 在當前檔案夾下,建立 XX 檔案
- git mv hello.rb lib ===>將hello.rb 檔案移動到 lib 檔案夾下
- git status : 查看到以下的狀態
$ git statusOn branch masterChanges to be committed: (use "git reset HEAD <file>..." to unstage) renamed: hello.rb -> lib/hello.rbChanges not staged for commit: (use "git add <file>..." to update what will be committed) (use "git checkout -- <file>..." to discard changes in working directory)
- git commit -m "xxxx" :將此次改變提交
通過使用 Git 來移動檔案,我們通知了 Git 兩件事:
Git建立分支
git checkedou -b greet //建立了一個名為greet的新分支
!上面語句是git branch branchname 及 git checkout branchname的簡寫(branchname:分支名)
導航分支
git checkout master //切換到master主分支
git checkout branchname:切換到分支branchname
當有兩個或多個分支時,使用
git hist --all //--all能顯示出來所有的分支
合并分支
git merge master //將分支mster合并到當前分支
衝突產生於解決(坑太多,只舉個小例子)
將分支切到master,此時更改hello.rb並且提交就會產生衝突。
原因:應為master已經和greet分支合并,但現在在master又有一個新的提交還沒有合并回greet,衝突產生。
如果此時返回greet分支並且嘗試合并master分支後,查看hello.rb,
衝突解決:在hello.rb中改正後,重新提交hello.rb
解決後:
變址vs合并(未知的問題:在重設greet分支後,立即重設master分支出現錯誤,好像需要重新提交所有檔案)
變基失敗
實用篇與遠程倉庫建立聯絡remote
查看所有的遠程連結資訊
git remote -v
查看某個遠端連線的詳細資料
git remote show [remote-name]
為本地添加一個普通的遠程倉庫git remote add pb git://github.com/paulboone/ticgit.git
pb為倉庫的別名,後面為倉庫的地址
為本地添加一個origin倉庫
git remote add origin [倉庫url]
重新命名遠端連線git remote renamed [old name] [new name]
刪除遠程倉庫git remote rm [shortname]
pull 和 fetch 的區別:
1.git fetch 相當於是從遠程擷取最新版本到本地,不會自動mergegit fetch origin master
2.git pull 當於是從遠程擷取最新版本並merge到本地
git向github提交代碼
1. 建立新的版本庫
在GitHub中,一個項目對應一個版本庫,建立一個新的版本庫,就是建立一個新的項目。
在GitHub中建立一個新的版本庫後,採取先複製,再通過推送完成GitHub版本庫的初始化。步驟如下:
1.複製版本庫:
git clone git@github.com:mecury/HelloWorld.git //mecury是註冊時的名字,HelloWorld是新建立的版本庫</br>
2.添加README.md檔案並提交(這個也可以直接在GitHub中修改)
git add REAMDE.md
3.向GitHub中推送,完成版本庫的初始化
git push origin master
2.從已有的版本庫中建立
對於要上傳的項目,首先應該建立本地的倉庫.
git init //在當前項目的根目錄下
向檔案中添加README.md檔案,並且提交(可以省略)
git add README.mdgit commit -m"README for project"
執行推送命令
git push -u origin master
強制推送命令,將會覆蓋遠程倉庫的不同之處
git push -f origin master
退出git的vim編輯器:
1.按 i ,進入insert編輯模式
2. 編輯完成後,按 esc 鍵
3. 輸入 :wq! ,然後斷行符號即可刪除