跟著R哥來到了新公司(一個從硬件向互聯網轉型中的公司),新公司以前的代碼基本是使用SVN做版本控制,所以R哥叫HG做了一次Git分享,準備把公司所有的代碼用Git作版本控制。平時自己雖然天天使用Git,但是總感覺知識有些零散,于是匯總了一些常用的Git命令。
常用配置
--system #系統級別
--global #用戶全局
--local #單獨一個項目
git config --global user.name "xxxx" #用戶名
git config --global user.email "xxxx@xxx.com" #郵箱
git config --global core.editor vim #編輯器
git config --global alias.st status #按這種方法,配置別名
git config -l #列舉所有配置
Git中3種狀態的一些操作
#將工作區的修改提交到暫存區
git add <file>
git add .
#------------------------------------------
#將暫存區的內容提交到版本庫
git commit <file>
git commit .
git commit -a #包括git add/ git rm /git commint 這三個操作,所有一般在操作工作區的時候,直接刪除了文件,而不是使用git rm的,最后提交是可以用這個,如下
#git commit -am "提交信息"
git commit -amend #修改最后一次提交的信息
#------------------------------------------
# 拋棄工作區修改(使用當前暫存區的內容狀態去覆蓋工作區,從而達到拋棄工作區修改的作用)
git checkout <file>
git checkout .
#------------------------------------------
#改變暫存區的修改(其實是重置HEAD,將指定版本庫的內容狀態去覆蓋暫存區,從而達到暫存區的改變)
git reset <file> #從暫存區恢復到工作區(不指定版本id,則默認為最后一次提交的版本id)
git reset . #從暫存區恢復到工作區
git reset $id # 恢復到指定的提交版本,該$id之后的版本提交都恢復到工作區
git reset --hard $id #恢復到指定的提交版本,該$id之后的版本提交全部會被拋棄,將不出現在工作區
#注:如果不小心使用了錯誤的HEAD重置,會發現HEAD指向了重置的版本id,該版本之后的版本提交都不見了,使用git log也無法找到,那么怎么恢復呢?使用下面兩個命令
git reflog show master | head #會顯示所有的版本記錄
git reset --hard $id #重新重置,至于--hard,請根據你時候將改變的內容放到工作區還是直接拋棄進行選擇
#------------------------------------------
#恢復某次提交(其實是某提提交的回滾操作,不影響其他的提交,所產生的效果創建一個新版本提交去回滾將指定的提交刪除,包括產生的差異文件不會出現在工作區,而是直接被拋棄)
git revert <$id>
git revert HEAD
#這里有一個很好的講解revert與reset的差異:git reset 是把HEAD向后移動了一下,而git revert是HEAD繼續前進,只是新的commit的內容和要revert的內容正好相反,能夠抵消要被revert的內容。
#------------------------------------------
#刪除文件的幾種方法(貌似Git2.0后有了變化)
#第一種直接在工作區刪除
rm your_file #直接在工作區刪除文件
git add -u . #將有改動的都提交到暫存區(包括修改的,刪除的等操作),貌似git2.0 不加 -u 參數也可以
git commint -m "message" #提交版本庫
#第二種方法直接在工作區刪除
rm your_file #直接在工作區刪除文件
git commit -am "message" #這個在前面提過,直接可以提交版本庫,-a會包括包括git add/ git rm /git commint 這三個操作
#第三種方法使用git rm
git rm <file> #不僅在工作區將文件刪除,同時將該刪除操作提交到暫存區
git commint -m "message" #提交版本庫
#關于git rm的其他補充
git rm --cached <file> #從暫存區中除去該文件,git將不再跟蹤該文件的變更,但仍然在工作區內,在需要.gitignore時經常用到
文件直接比較差異Diff
git diff
git diff <file> #比較工作區與暫存區文件的差異
git diff --cached # 比較暫存區和版本庫差異
git diff <$id1> <$id2> # 比較兩次提交之間的差異
git diff <branch1>..<branch2> # 在兩個分支之間比較
分支
git branch -r #查看遠程分支
git branch new_branch_name #新建一個分支
git branch --merged #查看已經被合并到當前分支的分支
git branch --no-merged #查看未被合并到當前分支的分支
git checkout branch_name #切換分支
git checkout -b branch_name #創建分支并切換
git branch -d branch_name #刪除分支
git branch -D branch_name #強制刪除分支
git push origin :branch-name #刪除遠程分支(先在本地刪除該分支),原理是把一個空分支push到server上,相當于刪除該分支。
#從遠程clone一個項目,雖然遠程上該項目是有分支的,但clone下來后發現只有master分支,解決:
git checkout -b not_master_branch origin/not_master_branch #本地創建一個分支,指向對應的遠程分支
git pull origin not_master_branch #將遠程的not_master_branch分支pull下來
git push origin not_master_branch #將修改后的not_master_branch分支push到遠程的not_master_branch
Tag
git tag v1.0.0 [SHA] #打一個輕量級的tag,只是一個commit的指向引用,[SHA]是可選擇值(某個commit的SHA),指定為哪個commit打tag,如果沒寫則直接為最后一個commit打tag
git tag -a v1.0.0 -m "你的附注信息" [SHA] #一個帶附注信息的tag,不是一個簡單的引用,而是單獨的一個對象,[SHA]是可選擇值(某個commit的SHA),指定為哪個commit打tag,如果沒寫則直接為最后一個commit打tag
git tag #列出所有的tag
git show v1.0.0 #打印指定tag的信息
git tag -d v1.0.0 #刪除本地指定tag
git push origin :refs/tags/v1.0.0 #刪除遠程tag
遠程
git remote -v # 查看遠程服務器地址和倉庫名稱
git remote show origin # 查看遠程服務器倉庫狀態
git remote add origin git@github:robbin/robbin_site.git # 添加遠程倉庫地址
git remote set-url origin git@github.com:robbin/robbin #修改遠程地址
git remote rm #刪除遠程創庫地址
從遠程拉取內容,提交內容到遠程
git pull #=git fetch + git merge
git fetch #拉取
git merge #合并
git push # push所有分支
git push origin master # 將本地主分支推到遠程主分支
git push -u origin master # 將本地主分支推到遠程(如無遠程主分支則創建,用于初始化遠程倉庫)
git push origin <local_branch> # 創建遠程分支, origin是遠程倉庫名
git push origin <local_branch>:<remote_branch> # 創建遠程分支
git push origin :<remote_branch> #先刪除本地分支(git br -d <branch>),然后再push刪除遠程分支
暫存管理
git stash #將工作區做的修改暫存到一個git棧中
git stash list #查看棧中所有暫存
git stash apply <暫存編號> #回復對應編號暫存到工作區,如果不指定編號為棧頂的,注意:這些暫存還在棧中
git stash pop #將棧頂的暫存,恢復到工作區,并從棧中彈出
git stash clear #清空暫存棧
創建遠程庫
git clone --bare git_url_path #clone的時候,將其創建成遠程創庫
git --bare init #初始化項目的時候,創建成遠程創庫
部分參考Robbin Fan大神的博客《Git常用命令備忘》