目錄
- clone
- add
- commit
- checkout
- pull
- push
- branch
- reset
- diff
- log
- status
- tag
- rebase
- cherry
- stash
- config
- revert
- reflog
遠程倉庫操作
檢出倉庫:$ git clone git://github.com/jquery/jquery.git
查看遠程倉庫:$ git remote -v
添加遠程倉庫:$ git remote add [name] [url]
刪除遠程倉庫:$ git remote rm [name]
修改遠程倉庫:$ git remote set-url --push [name] [newUrl]
拉取遠程倉庫:$ git pull [remoteName] [localBranchName]
推送遠程倉庫:$ git push [remoteName] [localBranchName]
分支操作
- 提交本地分支到遠程分支
如果想把本地的某個分支test提交到遠程倉庫,并作為遠程倉庫的master分支,或者作為另外一個名叫test的分支,如下:
$ git push origintest:master
// 提交本地test分支作為遠程的master分支
$ git push origintest:test
// 提交本地test分支作為遠程的test分支 - 刪除遠程分支:
git push origin:branch-name
冒號前面的空格不能少,原理是把一個空分支push到server上,相當于刪除該分支。
分支(branch)操作相關命令
查看本地分支:$ git branch
查看遠程分支:$ git branch -r (如果還是看不到就先 git fetch origin 先)
創建本地分支:$ git branch [name] ----注意新分支創建后不會自動切換為當前分支
切換分支:$ git checkout [name]
創建新分支并立即切換到新分支:$ git checkout -b [name]
直接檢出遠程分支:$ git checkout -b [name] [remoteName] (如:git checkout -b myNewBranch origin/dragon)
git clone
git clone <repository> <directory>,將repository指向的版本庫創建一個克隆到directory目錄中。目錄directory相當于克隆版本庫的工作區,文件都會檢出,版本庫位于工作區下得.git目錄中。
git clone --bare <repository> <directory.git>
git clone --mirror <repository> <directory.git>
上面的兩種克隆版本都不包含工作區,直接就是版本庫的內容,這樣的版本庫稱為裸版本庫。
git branch
git branch,顯示當前所在的分支
git branch <branchname>,創建新的分支branchname
git branch -d <branchname> ,刪除名稱為branchname的分支
git checkout
git checkout branchname,會改變HEAD頭指針,主要用于切換分支
git checkout -b branchname,用于創建一個新的分支,并且切換到創建的新的分支上
git checkout --filename,用暫存區中的filename文件來覆蓋工作區中的filename文件
git checkout branch --filename,用版本庫中的filename文件來覆蓋暫存區和工作區中的filename文件
git checkout <commit> --filename,用指定提交中的文件覆蓋暫存區和工作區中對應的文件
git checkout -- .或者git checkout .,用暫存區的所有文件直接覆蓋本地文件,取消所有的本地的修改,是一條危險的操作
git rm
rm命令刪除的文件只是在本地進行了刪除,尚未添加到暫存區,也就是說,直接在工作區刪除,對暫存區和版本庫沒有任何影響。
git rm命令會將刪除動作加入暫存區,這是執行提交動作,就從真正意義上執行了文件刪除
git reset
把當前分支指向另一個位置,并且有選擇的變動工作目錄和索引
git reset --hard <commit>,替換引用的指向,替換暫存區和工作區
git reset --soft <commit>,只更改引用的指向,不影響暫存區和工作區的內容,但是**將commitID之后的修改置為暫存區狀態,版本庫的內容變更為上個提交之前的內容**。
撤銷版本庫的提交至暫存區git reset,用HEAD指向的目錄樹重置暫存區,不會影響工作區的內容,但是暫存區和版本庫的內容就變更為commitID 之前的。
撤銷版本庫和暫存區的提交至工作區,變為未提交狀態`
git reset -- filename,將文件filename的改動撤出暫存區,暫存區其他文件不變,但不影響工作區。
git add
git add 在提交你修改的文件之前,你需要把它們添加到暫存區。如果該文件是新創建的,你可以執行將該文件添加到暫存區
git add . Git會遞歸地將你執行命令時所在的目錄中的所有文件添加上去,所以如果你將當前的工作目錄作為參數,它就會追蹤那兒的所有文件
git add -u 使用-u參數調用了git add命令,會將本地有改動(包括刪除和修改)的已經追蹤的文件標記到暫存區中。
git add -A 使用-A參數會將添加所有改動的已跟蹤文件和未跟蹤文件。
git add -i,交互式的方式進行添加。
git status
git status,查看你的代碼在緩存與當前工作目錄的狀態
git status -s,將結果以簡短的形式輸出
git diff
git diff <file> 比較當前文件和暫存區文件差異 git diff
git diff <id1><id2> 比較兩次提交之間的差異
git diff <branch1> <branch2> # 在兩個分支之間比較
git diff --staged 比較暫存區和版本庫差異
git diff --cached 比較暫存區和版本庫差異
git diff HEAD <file> 工作區和分支版本庫
git diff --stat 僅僅比較統計信息
git cat-file
git cat-file -t 查看Git對象的類型,主要的git對象包括tree,commit,parent,和blob等。
git cat-file -p,查看Git對象的內容
git log
git log --oneline 可以顯示更加短小的提交ID.
git log --graph 顯示何時出現了分支和合并等信息.
git log --pretty=raw 顯示提交對象的parent屬性.
git config
git config <section>.<key>,讀取和更改INI配置文件的內容。
git config <section>.<key> <value>,修改INI配置文件中某個配置的鍵值
在全局空間中添加新的用戶
git config --global user.name "harvey liu"
git config --global user.email harvey_liu@163.com
設置git命令的別名
git config --global alias.ci commit
git config --global alias.co checkout
刪除git全局配置文件中的用戶名
git config --unset --global user.name
git config --unset --global user.email
git revert
撤銷某次提交
git revert HEAD^ , HEAD之前的提交的反轉提交,不會影響工作區,只是針對版本庫
- 注意事項
在clone完成之后,Git 會自動為你將此遠程倉庫命名為origin(origin只相當于一個別名,運行git remote –v或者查看.git/config可以看到origin的含義),并下載其中所有的數據,建立一個指向它的master 分支的指針,我們用(遠程倉庫名)/(分支名) 這樣的形式表示遠程分支,所以origin/master指向的是一個remote branch(從那個branch我們clone數據到本地),但你無法在本地更改其數據。
- **git branch -r **
(to show remote branches git knows about)
origin/HEAD -> origin/master
origin/master
可以發現origin/master是遠程分支
$git diff origin/master master (show me the changes between the remote master branch and my master branch).
需要注意的是,remotes/origin/master和origin/master的指向是相同的
-
git push origin master
origin指定了你要push到哪個remote
master其實是一個“refspec”,正常的“refspec”的形式為”+<src>:<dst>”,冒號前表示local branch的名字,冒號后表示remote repository下 branch的名字。注意,如果你省略了<dst>,git就認為你想push到remote repository下和local branch相同名字的branch。比如:
**$git push origin master:master **
(在local repository中找到名字為master的branch,使用它去更新remote repository下名字為master的branch,如果remote repository下不存在名字是master的branch,那么新建一個)
$git push origin master (省略了<dst>,等價于“git push origin master:master”)
$git push origin master:refs/for/mybranch (在local repository中找到名字為master的branch,用他去更新remote repository下面名字為mybranch的branch)
**$git push origin HEAD:refs/for/mybranch **(HEAD指向當前工作的branch,master不一定指向當前工作的branch,所以我覺得用HEAD還比master好些)
**$git push origin :mybranch **(再origin repository里面查找mybranch,刪除它。用一個空的去更新它,就相當于刪除了)