git 經常使用總結

git

[TOC]linux

設置

git config --global user.name ""
git config --global user.email ""

基本操做

  1. 初始化git庫:git init
  2. 添加文件到分支:
    1. git add filename
    2. git commit -m "statement about the change"
  3. 查看倉庫狀態:git status,檢查倉庫各分支狀態
  4. 修改已提交到分支的文件後,使用git add保存修改,使用git checkout放棄修改。
  5. 使用git add暫存更改後,可使用git reset取消暫存。

若是有多個文件,而且不一樣文件間有的是爲了同一個功能,有的不是,最好的是將他們分別暫存提交,能更容易的調優每一次提交。git

  1. 修改git commit中使用的編輯器:git config --global core.editor vim
  2. 在暫存了某次修改,可是並未提交,後又修改了文件,那麼提交只能提交已經暫存的修改。

使用 git . 來添加當前文件夾中全部子文件夾和文件。shell

  1. 使用git log查看提交過的記錄

git log:一條提交記錄分多行展現:第一行是提交的惟一hash值;第二行是做者,第三行是提交時間,而後是提交的說明vim

  • 使用git log --pretty=oneline 使得每條記錄做爲一行輸出
  • 使用參數--max-count=2表示從記錄中選擇最新的兩條記錄輸出
  • 參數--since="5 minutes ago" 5分鐘前到如今的提交記錄
  • 參數--until="5 minutes ago" 輸出從倉庫創建到5分鐘前提交的記錄
  • 參數--author="username" 輸出username用戶提交的記錄
  • 參數--merge 輸出只有merge的提交記錄
  • 使用man git-log 查看log相關的參數
  • 使用--graph 使用ascll圖形佈局顯示提交樹
  • 使用--date=short 保留日期格式更好且更短

git log的pretty 的format參數值可使用安全

  1. %h:commit的hash時間
  2. %cd:create datetime建立時間
  3. %s:statement註釋
  4. %an: author name

爲常見命令設置別名

在當前用戶home目錄$HOME(linux使用命令 cd ~進入)中,有git的配置文件.gitconfig 輸入配置以下:服務器

[alias]
	co = checkout
	ci = commit
	st = status
	br = branch
	hist = log --pretty=formate:'%h %ad | %s%d [%an]' --graph --date=short
	type=cat-file -t
	dump = cat-file -p

設置shell別名:編輯器

alias gs='git status '
alias ga='git add '
alias gb='git branch '
alias gc='git commit'
alias gd='git diff'
alias gco='git checkout '
alias gk='gitk --all&'
alias gx='gitx --all'

alias got='git '
alias get='git '

若是須要使用go語言,須要將上述alias中go 改成gco比較好。 gs可能與linux ghostscript衝突。須要注意!佈局

標記版本

使用git tag v1(其中v1表示版本號)給當前版本打上標籤fetch

使用git checkout轉到其餘版本,而後使用git tab versionnumber給轉到的版本打上標籤。指針

使用git checkout v1^表示v1上一個版本。或者使用git checkout v1~1

撤銷更改

使用git checkout master 跳轉到master上面(否則以後操做的時候就把當前master的記錄給覆蓋掉了)

  1. 沒有暫存 若本地更改沒有使用git add 暫存到倉庫,那麼可使用git checkout filename 將文件轉到以前的master版本保存的記錄。
  2. 已經暫存 使用git reset HEAD filename 去取消暫存,可是reset命令不會更改文件內容, 文件中已經修改的內容還在文件中。若是想將文件中的內容恢復到原來狀態,可使用git checkout filename
  3. 已經提交 使用git revert HEAD(會自動打開commit編輯界面)或者git revert --no-edit(不會打開編輯器),將提交版本回到上一個版本。也能夠就愛那個HEAD部分使用更早版本的hash值代替,直接回到更早的版本。
  4. 從分支中移除提交 revert命令是撤銷倉庫中任意提交的命令。 reset 命令是重置命令,當給定 一個提交的 引用(標籤,hash值, 分支)時, reset命令將:
  5. 重寫當前分支到指定的特定提交
  6. 重置暫存區到匹配的特定提交(可選)
  7. 重置工做目錄到匹配特定的提交(可選)

可使用git reset --hard v1將分支中中v1版本之後的提交所有移除。 其中--hard參數表示應當更新工做目錄(文件和文件夾)以便與新的分支頭保持一致。

使用git hist --all能夠看到以前的全部提交記錄,什麼文件都沒有丟。被移除的內容會一直保存在倉庫中,知道運行垃圾回收軟件。

重置通常是安全的,可是若是分支是共享在遠程服務器上的,那麼reset可能會致使用戶共享的分支混亂

在上例中,能夠經過git tag -d tagname 移除標籤,讓倉庫回收刪除的分支(回收垃圾)。 回收後使用git hist --all,在分支的歷史記錄中就看不到移除的分支信息了,好像那個分支從未提交同樣。

修改提交

在提交了一個版本後,發現提交的版本忘了一項紀錄,可是又不想提交兩次,則能夠在修改/添加好要修改的記錄後,使用git add filename將添加/修改的file暫存,而後使用git commit --amend -m "comment"命令,替換掉上次的提交記錄。

移動文件

在項目須要調整文件結構的時候,須要移動文件。 使用git mv 命令移動文件。

.git 目錄

使用ls .git查看.git目錄下文件

$ ls .git
COMMIT_EDITMSG  ORIG_HEAD   hooks       logs        rr-cache
HEAD        config      index       objects
MERGE_RR    description info        ref

對象存儲

對象存儲在objects文件夾中,文件愛你都通過壓縮處理。

$ ls -C .git/objects
09  1f  27  43  69  83  97  af  e4  info
0f  22  28  58  6b  94  9c  b5  e7  pack
11  24  32  59  78  96  a1  c4  eb
$ ls -C .git/objects/09
6b74c56bfc6b40e754fc0725b8c70b2038b91e  9fb6f9d3a104feb32fcac22354c4d0e8a182c1

在objects目錄的子目錄中,每一個文件都是用38字符命名的文件。

配置

配置在.git/config文件中,該文件是項目級配置文件。在這兒的配置條目將覆蓋你的主目錄中.gitconfig 文件中的配置條目。

$ cat .git/config
[core]
    repositoryformatversion = 0
    filemode = true
    bare = false
    logallrefupdates = true
    ignorecase = true

分之與標籤

$ ls .git/refs
heads
tags
$ ls .git/refs/heads
master
$ ls .git/refs/tags
v1
v1-beta
$ cat .git/refs/tags/v1
1f7ec5eaa8f37c2770dae3b984c55a1531fcc9e7

.git/refs/heads文件夾保存全部的分支,文件名爲分支名。文件中的內容爲該分支最後一次提交的hash值。 .git/refs/tags 文件夾保存標籤。每一個標籤文件中是標籤對應的提交版本hash值。

HEAD文件

$ cat .git/HEAD
ref: refs/heads/master

HEAD文件保存當前分支的引用。

分支

建立分支

使用git checkout -b branchname建立並切換到分支。 它是git branch branchnamegit checkout branckname的簡寫。

導航分支

使用git checkout branchname 切換分支,在不一樣分支下,相同文件的內容可能會不同。

合併分支

當出現多個分支,master開始修改文件,那麼在git log --graph --all就可看到版本分叉。 此時可能須要將多個分支合併 使用git merge branchname將當前分支與branchname分支合併到當前分支。

將master分支修改後,bak分支不變,merge master分支到bak 可保持bak與master的兼容性。

衝突和解決衝突

  1. 合併 當master分支和greeter分支一致,修改master分支中與greeter分支中共有的文件時,會出現衝突。

衝突緣由:greeter有一個文件的版本,master有一個版本,合併的時候怎麼選擇?

使用編輯器打開衝突文件,手動解決衝突。

解決衝突後,將greeter merge到master,執行的是快速合併,由於master頭是分支greeter頭的祖先,能夠進行快速合併,當快速合併時,分支指針簡單的前進到與greeter分支相同的提交處。

  1. 變基 可使用git rebase master將master分支的全部的更改和greeter分支更改合併到greeter分支。而且提交樹會被重寫,以致於master分支稱爲greeter分支的一部分。

通常在公有倉庫使用合併,在短時間本地項目中使用變基。 變基會丟失歷史提交信息!!! 變基會形成老版本丟失(垃圾回收時)

clone

使用git clone from to 可將from倉庫克隆到to倉庫。這兩個倉庫幾乎同樣,除了to倉庫多了一個origin分支。

使用git remote 查看遠程倉庫的列表 使用git remote show origin便可查看origin的信息。

查看遠程分支

使用git branch 發現只有master分支列出來了。【git branch 默認只會列出本地分支】

使用git branch --all列出所有分支,此時能夠看到從遠程倉庫中克隆的分支。

取得遠程更改

使用git fetch 從遠程倉庫拉下更改,拉下的更改是合併到了origin/master分支【即origin倉庫的master分支】,可是它並無將拉下的更改整合到克隆倉庫的分支中。

git fetch 從遠程倉庫中取得新的提交,可是它不會將這些提交合併到本地倉庫中。

合併遠程更改

使用git merge origin/master合併origin/master分支到本地分支。

上述的拉下併合並能夠由操做git pull完成,git pull等價於git fetchgit merge

添加跟蹤分支

添加遠程分支到本地分支。git brach --track greeter origin/greeter 操做後,在克隆倉庫中就能夠看到遠程倉庫的greeter分支了。

推送更改到遠程分支

使用git push origin master,將本地倉庫推送到遠程倉庫的master分支。

此時若是在遠程倉庫包含工做目錄,並且使用git checkout master 正在master分支中。會報錯「git 不容許push 操做更新到non-bare 倉庫,由於這樣會致使remote倉庫的索引(index)和工做樹(work tree) 與你push的不一致」。 ** 解決的辦法**:最好是將更改push到裸倉庫;也可將遠程倉庫checkout到別的分之下。這樣就能夠push到遠程倉庫的master分支了。

裸倉庫

裸倉庫指的是沒有工做目錄(工做目錄指須要作版本管理的文件目錄)的倉庫,即只有原倉庫中的.git目錄下的文件。

裸倉庫通常用於共享。方便合做開發。 好比多人開發: A:裸倉庫 B:倉庫1 C:倉庫2 B修改後,push到A,C獲取更改只須要從A中獲取更改,並與本身的分支合併。

使用git clone --bare hello hello.git建立裸倉庫hello.git

託管倉庫

使用git daemon --verbose --export-all --base-path=.使用git共享本身的倉庫。

若是想使用遠程push,託管的倉庫必須設置參數--enable=receive-pack

相關文章
相關標籤/搜索