Git-Pro
自己在工作中常用的git命令行奔滑!
<a name="basic">Git基本操作</a>
用戶信息
當我們要進行Git提交的時候宝穗,我們作為提交者要以什么姓名和電子郵件地址進行提交?
git config --global user.name "DefaultYuan"
git config --global user.email johndoe@example.com
查看配置信息
git config --list
上面命令配置好的用戶信息可以通過git config --list
命令查看用戶名秩贰、郵箱、別名谐宙、remote地址等等!真是一覽無遺界弧!當然也可以到.git目錄下的查看config文件
從現(xiàn)有的倉庫克隆到本地
git clone https://github.com/DefaultYuan/Git-Pro.git A/B
以上命令是將現(xiàn)有的倉庫克隆到A目錄下的B文件夾里面凡蜻,如果后面沒有添加A/B就會默認新建一個名為Git-Pro文件夾,且將倉庫克隆到這個文件夾下面夹纫!
提交代碼到本地倉庫
當我們在本地修改了文件咽瓷,比如修改了README.md
文件,我們首先查看狀態(tài)確定哪些文件當前處于什么狀態(tài)舰讹!
git status
該命令執(zhí)行完終端輸出如下:
On branch master
Your branch is up-to-date with 'origin/master'.
Changes not staged for commit:
(use "git add <file>..." to update what will be committed)
(use "git checkout -- <file>..." to discard changes in working directory)
modified: README.md
no changes added to commit (use "git add" and/or "git commit -a")
當前README.md
文件是有做修改的茅姜,該文件還沒有添加到stage的,提示我們可以通過git add <file>來添加月匣,當然我們也可以通過git checkout -- <file>來撤銷本次做到修改钻洒,建議不要輕易這么干!后續(xù)我會講講相關撤銷操作锄开。
現(xiàn)在我們加入stage
git add README.md
如果我們現(xiàn)在要將本地所有修改的文件進行添加素标,可以用該命令:
git add .
最后,我們進行提交
git commit -m "fix 具體哪個功能"
如果本地我們改的內容有點多萍悴,涉及到修改多個模塊的代碼头遭,建議多次添加并提交寓免!
將本地代碼提交到遠程倉庫
繼上面的提交操作之后
我們先拉取一下遠程倉庫的更新內容
git fetch
接下來,我們就可以手動merge
遠程倉庫的修改了
git merge
我們?yōu)榱俗屛覀兊奶峤挥涗洷容^美觀一些的話计维,在這里我們會用rebase
去代替merge
操作
git rebase
或者用pull
來拉取代碼
git pull
fetch
跟pull
有啥區(qū)別呢袜香?
fetch
從遠程倉庫抓取到本地之后不會自動merge
操作,但pull
會自動merge
最后我們進行push
操作
git push
這樣我們就可以做到遠程倉庫和本地倉庫的同步了鲫惶!
Git進階
上面講的是一些Git基本操作蜈首。
接下來講講一些Git進階小技巧
提交技巧
當我們要將stage
里的修改分多次提交到本地倉庫,也就是具體到哪個文件
git commit DefaultYuan.txt -m "fix 具體功能"
如果我們想查看要提交的內容與版本庫中的比較,然后進行提交
git commit -v
將工作區(qū)和stage
中的所有修改的文件一次性提交到本地倉庫
git commit -a
這樣會默認使用 vi 添加描述,我們也可以在.git/config
的core
中editor = vim
指定編輯器
當然也可以使用-m
選項直接添加提交信息
git commit -a -m "fix 具體功能"
有時候我們需要對上一次提交信息進行修改
git commit --amend
也可以后面添加參數-m
做到修改
查看狀態(tài)
查看工作區(qū)中所有目錄下文件的變動
git status
比較工作區(qū)與暫存區(qū)的改動
git diff
添加參數--cached
欠母,比較暫存區(qū)和版本庫之間的區(qū)別
git diff --cached
添加參數HEAD
欢策,比較工作區(qū)、暫存區(qū)和版本庫之間的區(qū)別
git diff HEAD
HEAD
關鍵字它指的是當前分支的最新提交赏淌,相當于一個指針,后續(xù)講到新建分支也會提到它
stash
的使用
有時候我們在工作區(qū)進行開發(fā)并且不想提交的時候踩寇,這時我們又想pull
最新代碼;或者又想切到另外一個分支上修改緊急bug的時候
git stash可以暫存當前的工作區(qū)內容
可以先暫存當前的工作區(qū)的內容
git stash
等我們切到另外分支修改完了bug之后猜敢,可以切回之前分支
然后恢復之前工作區(qū)的內容繼續(xù)開發(fā)
git stash pop
也可以查看stash
的Git棧信息
git stash list
當我們的stash
棧列表里面有很多姑荷,并且我們想要找到對應的版本號
并且將我們想要的版本號為stash@{2}的工作內容取出來
git stash apply stash@{2}
也可以查看版本號為stash@{2}的工作內容
git stash show stash@{2}
當我們的stash
棧列表的工作內容都應用回來的時候
可以將棧清空
git stash clear
分支
分支在Git里面是比較廉價的盒延,我們在開發(fā)的時候可以在本地倉庫創(chuàng)建很多條分支
新建一條名字為dev的分支
git branch dev
這種創(chuàng)建方式會依然停留在當前分支
開發(fā)新功能缩擂、或者修改bug,我們會創(chuàng)建一條分支并切到新開分支上開發(fā)
git checkout -b dev_fixHot
也可以從當前分支新建一個dev分支添寺,指向指定commit
git branch dev f0299e2
f0299e2
是隨便寫的胯盯,具體要以我們自己的commit
切換到指定分支
git checkout dev
分支其實也是指向某個commit
的指針,HEAD
也是一個指針计露,它指向當前工作目錄下的commit
因此checkout
就是讓HEAD
指向dev分支
刪除dev分支
git branch -d dev
強制刪除dev分支
git branch -D dev
將本地dev分支與dev_fixHot遠程分支建立追蹤關系
git branch --set-upstream dev origin/dev_fixHot
添加一個dev遠程分支
git push origin dev:dev
刪除dev遠程分支
git push origin :dev
或者
git push origin --delete dev
選擇一個commit
,合并到當前分支
git cherry-pick f0299e2
合并分支rebase
和merge
在工作中博脑,如果團隊開發(fā)同一個項目的人數特別多的時候,每個人都在自己的分支上開發(fā)
在開發(fā)過程中票罐,為了使提交記錄直觀叉趣,方便在一條分支上查看提交記錄,可以對分支進行衍合该押,一般是在做了一些小的修改之后會用它
將修改commit
到本地分支上之后
當本地分支上有相對應的遠程分支疗杉,可以直接使用
git rebase
為了方便講解,origin/dev_homepageFix
這個遠程分支是隨便寫的分支名
當這次commit
要衍合到dev_homepageFix
分支上時
git rebase origin/dev_homepageFix
最后就可以push
跟遠程倉庫同步了
當我們到項目接近尾聲的時候蚕礼,需要將各自的分支都合并到dev
分支上去
先抓取最新倉庫更新
git fetch
然后切到dev
分支上
git checkout dev
再分別合并各個分支烟具,這里以dev_homepageFix
分支為例
git merge origin/dev_homepageFix
撤銷操作
當我們想去整理我的提交,或者是把不該這次提交的修改提交了奠蹬,我們可以對修改進行撤銷朝聋,或者對提交進行撤銷
恢復暫存區(qū)的所有文件到工作區(qū)
git reset HEAD
恢復暫存區(qū)的指定的某個文件到工作區(qū)
git reset HEAD README.md
我們做了一些修改,然后覺得自己做錯了囤躁,不想提交
可以重置暫存區(qū)冀痕、工作區(qū)荔睹,這樣就能與上次提交保持一致,建議不要輕易這么做言蛇!
git reset --hard
當我們想重新整理提交的時候应媚,比如說將上兩次的提交整理到一次提交,我們可以重置到上兩次的上次提交commit
可以重置到指定的commit
,并重置了暫存區(qū),但工作區(qū)是不變的
git reset 2126dce
這種情況也會引發(fā)另外一個問題猜极,當我們本地倉庫與遠程倉庫一致的時候中姜,然后我們重置,就需要用到push
的force
來進行強推跟伏,這是我們不想操作的丢胚,后續(xù)我會講解一下強推的小建議!
新建一個commit
受扳,用來撤銷指定commit
携龟,后者所有變化都會被前者抵消,并應用到當前分支
我們也是不要輕易這么去做勘高!
git revert 2126dce
起別名
當我們有比較常用的命令行用的比較頻繁峡蟋,但是我們又覺得完整把它們敲出來費事
可以在 ~/.gitconfig
文件里面進行設置別名,添加alias
[alias]
ft = fetch
ck = checkout
st = status
br = branch
rb = rebase
lg = log
然后試一下git st
就管用了!
標簽的相關操作
標簽可以針對某一時間點的版本做標記华望,常用于版本發(fā)布
列出標簽
git tag
創(chuàng)建附注標簽
git tag -a v0.0.1-pro -m "pro發(fā)版"
切換到標簽
git checkout v0.0.1-pro
查看標簽的版本信息
git show v0.0.1-pro
刪除標簽
git tag -d v0.0.1-pro
給指定的commit打標簽
git tag -a v0.0.1-pro 9fbc3dd
將v0.0.1-pro標簽提交到git服務器
git push origin v0.0.1-pro
將本地所有標簽一次性提交到git服務器
git push origin –tags
找回Git中丟失的Commit
在使用Git的過程中蕊蝗,有時候會因為一些誤操作,比如reset赖舟、rebase蓬戚、merge等,同時自己的Commmit記錄也消失了。
不用慌宾抓,我們在Git上做的任何操作都只是在原來之前的操作上做修改子漩,并且會被記錄下來保存,也就是說無論你做了什么石洗,對于Git來說都可以進行回滾操作幢泼。
找回Commit
這里以git reset --hard
為例,如果我們這樣操作讲衫,提交會消失缕棵。
這時我們可以使用reflog
查看一下
git reflog
此時會出現(xiàn)這樣
99abc5a HEAD@{1}: commit: do something
我們要找回我們這個commit
,只需要做如下操作:
git reset --hard 99abc5a