[TOC]linux
git config --global user.name "" git config --global user.email ""
git init
git add filename
git commit -m "statement about the change"
git status
,檢查倉庫各分支狀態git add
保存修改,使用git checkout
放棄修改。git add
暫存更改後,可使用git reset
取消暫存。若是有多個文件,而且不一樣文件間有的是爲了同一個功能,有的不是,最好的是將他們分別暫存提交,能更容易的調優每一次提交。git
git config --global core.editor vim
使用
git .
來添加當前文件夾中全部子文件夾和文件。shell
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參數值可使用安全
- %h:commit的hash時間
- %cd:create datetime建立時間
- %s:statement註釋
- %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的記錄給覆蓋掉了)
git add
暫存到倉庫,那麼可使用git checkout filename
將文件轉到以前的master版本保存的記錄。git reset HEAD filename
去取消暫存,可是reset命令不會更改文件內容, 文件中已經修改的內容還在文件中。若是想將文件中的內容恢復到原來狀態,可使用git checkout filename
git revert HEAD
(會自動打開commit編輯界面)或者git revert --no-edit
(不會打開編輯器),將提交版本回到上一個版本。也能夠就愛那個HEAD
部分使用更早版本的hash值代替,直接回到更早的版本。revert
命令是撤銷倉庫中任意提交的命令。 reset
命令是重置命令,當給定 一個提交的 引用(標籤,hash值, 分支)時, reset命令將:可使用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
命令移動文件。
使用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值。
$ cat .git/HEAD ref: refs/heads/master
HEAD文件保存當前分支的引用。
使用git checkout -b branchname
建立並切換到分支。 它是git branch branchname
和git checkout branckname
的簡寫。
使用git checkout branchname
切換分支,在不一樣分支下,相同文件的內容可能會不同。
當出現多個分支,master開始修改文件,那麼在git log --graph --all
就可看到版本分叉。 此時可能須要將多個分支合併 使用git merge branchname
將當前分支與branchname分支合併到當前分支。
將master分支修改後,bak分支不變,merge master分支到bak 可保持bak與master的兼容性。
衝突緣由:greeter有一個文件的版本,master有一個版本,合併的時候怎麼選擇?
使用編輯器打開衝突文件,手動解決衝突。
解決衝突後,將greeter merge到master,執行的是快速合併,由於master頭是分支greeter頭的祖先,能夠進行快速合併,當快速合併時,分支指針簡單的前進到與greeter分支相同的提交處。
git rebase master
將master分支的全部的更改和greeter分支更改合併到greeter分支。而且提交樹會被重寫,以致於master分支稱爲greeter分支的一部分。通常在公有倉庫使用合併,在短時間本地項目中使用變基。 變基會丟失歷史提交信息!!! 變基會形成老版本丟失(垃圾回收時)
使用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 fetch
和git 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