git筆記,git學習筆記

來源:互聯網
上載者:User

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

標記先前的版本======》通過上面的方法擷取舊版本,然後再為目前的版本打標籤。

  • git tag :擷取日誌中的所有標籤

去除標籤:

  • git tag -d xx : 移除標籤xx

撤銷更改:(這裡都以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.gitpb為倉庫的別名,後面為倉庫的地址

為本地添加一個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! ,然後斷行符號即可刪除

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.