Git學(xué)習(xí)
1惰聂、初始化git倉庫
將一個目錄變成Git
可以管理的倉庫 。
git init
2咱筛、添加指定文件到倉庫
git add <file>
3搓幌、提交文件到倉庫
提交文件到倉庫,并寫上本次提交備注迅箩。
git commit -m <message>
4溉愁、查看提交日志
查看提交日志,可以看到3次提交的日志饲趋,如果看的不清晰可以加上--pretty=oneline
參數(shù)拐揭,想看合并圖加上--graph
參數(shù)。
git log
5奕塑、回退
1堂污、回退版本
首先,Git
必須知道當(dāng)前版本是哪個版本爵川,在Git
中敷鸦,用HEAD
表示當(dāng)前版本,也就是最新的提交寝贡,上一個版本就是HEAD^
扒披,上上一個版本就是HEAD^^
,當(dāng)然往上100
個版本寫100個^
比較容易數(shù)不過來圃泡,所以寫成HEAD~100
碟案。
回退上一個版本:
git reset --hard HEAD^
回退指定版本:【1094a
版本號的一部分,沒必要寫全颇蜡,前幾位就可以了价说,Git
會自動去找 】辆亏。
git reset --hard 1094a
2、回退暫存區(qū)【git add
之后】的到工作區(qū)
git reset HEAD <file>
6鳖目、查看歷史命令
查看歷史命令扮叨,以便確定要回到未來的哪個版本 。
git reflog
7领迈、查看當(dāng)前狀態(tài)
git status
8彻磁、對比區(qū)別
查看工作區(qū)和版本庫里面最新版本的區(qū)別 。
git diff HEAD -- <file>
9狸捅、撤銷
把文件在工作區(qū)的修改全部撤銷衷蜓,這里有兩種情況:
一種是文件自修改后還沒有被放到暫存區(qū)【git add
之后】,現(xiàn)在尘喝,撤銷修改就回到和版本庫一模一樣的狀態(tài)磁浇。
一種是文件已經(jīng)添加到暫存區(qū)后【git add
之后】,又作了修改朽褪,現(xiàn)在置吓,撤銷修改就回到添加到暫存區(qū)后的狀態(tài)。
總之鞍匾,就是讓這個文件回到最近一次git commit
或git add
時的狀態(tài)交洗。
git checkout -- <file>
命令中的--
很重要,沒有--
橡淑,就變成了切換到另一個分支的命令构拳。
git checkout -- <file>
10、刪除文件
如果手動將文件刪除梁棠,然后使用git rm <file>
和git add<file>
效果是一樣的 【之前已經(jīng)提交的】置森。
git rm
假如刪錯了,因為版本庫里還有呢符糊,所以可以很輕松地把誤刪的文件恢復(fù)到最新版本凫海。
git checkout -- <file>
11、添加遠程倉庫
現(xiàn)在的情景是男娄,你已經(jīng)在本地創(chuàng)建了一個Git
倉庫后行贪,又想在GitHub
創(chuàng)建一個Git
倉庫愕难,并且讓這兩個倉庫進行遠程同步岖常,這樣键兜,GitHub
上的倉庫既可以作為備份末购。
首先,登陸GitHub
笋庄,然后在右上角找到Create a new repo
按鈕另凌,創(chuàng)建一個新的倉庫康吵。
Repository name
填入demo
实夹,其他保持默認設(shè)置橄浓。
點擊Create repository
按鈕粒梦,就成功地創(chuàng)建了一個新的Git
倉庫。
git remote add origin https://github.com/ffxnh/demo.git
git push -u origin master 【第一次推送`master`分支的所有內(nèi)容需要加`-u`,可能會讓你輸入`token`】
git push origin master 【此后荸实,每次本地提交后匀们,只要有必要,就可以使用命令推送最新修改】
Gitbub token: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
泪勒,這個在右上角settings
---> Developer settings
---> Personal access tokens
---> New GitHub App
12昼蛀、刪除遠程倉庫
使用前宴猾,建議先用git remote -v
查看遠程庫信息 圆存。
git remote -v
origin https://github.com/ffxnh/demo.git (fetch)
origin https://github.com/ffxnh/demo.git (push)
根據(jù)名字刪除git remote rm <name>
,比如刪除origin
,
git remote rm origin
注意:此處的刪除其實是解除了本地和遠程的綁定關(guān)系仇哆,并不是物理上刪除了遠程庫沦辙。遠程庫本身并沒有任何改動。要真正刪除遠程庫讹剔,需要登錄到GitHub
油讯,在后臺頁面找到刪除按鈕再刪除。
13延欠、克隆遠程倉庫
https
協(xié)議
git clone https://github.com/ffxnh/demo.git
git
協(xié)議
git clone git@github.com:ffxnh/demo.git
14陌兑、創(chuàng)建與合并分支
我們創(chuàng)建dev
分支,然后切換到dev
分支由捎,git checkout -b <name>
或git switch -b <name>
git checkout -b dev 【`git switch -b dev`】
git checkout
命令加上-b
參數(shù)表示創(chuàng)建并切換兔综,相當(dāng)于以下兩條命令
git branch dev
git checkout dev 【`git switch dev`】
查看當(dāng)前分支 , git branch
命令會列出所有分支,當(dāng)前分支前面會標(biāo)一個*
號狞玛。
git branch
* dev
master
合并某分支到當(dāng)前分支 git merge <name>
git merge dev
Updating b7e797b..78d5f19
Fast-forward
test.txt | 3 ++-
1 file changed, 2 insertions(+), 1 deletion(-)
注意到上面的Fast-forward
信息软驰,Git
告訴我們,這次合并是“快進模式”心肪,也就是直接把master
指向dev
的當(dāng)前提交锭亏,所以合并速度非常快
刪除分支git branch -d <name>
硬鞍,如果該分支沒有被合并過慧瘤,使用git branch -D <name>
刪除
git branch -d dev
注意:通常,合并分支時固该,如果可能锅减,Git
會用Fast forward
模式,但這種模式下蹬音,刪除分支后上煤,會丟掉分支信息。
如果要強制禁用Fast forward
模式著淆,Git
就會在merge
時生成一個新的commit
劫狠,這樣拴疤,從分支歷史上就可以看出分支信息。
git merge --no-ff -m "message" <name>
--no-ff
參數(shù)独泞,表示禁用Fast forward
呐矾,因為生成一個新的commit
所以寫上信息
git merge --no-ff -m "merge with no-ff" dev
15、解決沖突
git merge feature1
Auto-merging test.txt
CONFLICT (content): Merge conflict in test.txt
Automatic merge failed; fix conflicts and then commit the result.
第一行
dev提交的
<<<<<<< HEAD
master提交的
=======
feature1提交的
>>>>>>> feature1
需要手動解決懦砂, Git
用<<<<<<<
蜒犯,=======
,>>>>>>>
標(biāo)記出不同分支的內(nèi)容荞膘,我們修改如下后罚随,繼續(xù)提交
第一行
dev提交的
master提交的
feature1提交的
執(zhí)行git add <file>
和git commit - m "message"
git add test.txt
git commit -m "解決沖突"
16、解決BUG
時羽资,當(dāng)前分支功能未完成淘菩,怎么辦
Git
還提供了一個stash
功能,可以把當(dāng)前工作現(xiàn)場“儲藏”起來屠升,等以后恢復(fù)現(xiàn)場后繼續(xù)工作
git stash
接下來應(yīng)該切換到master
分支后潮改,新建并切換一個修改BUG
的分支, 修復(fù)完成后,切換到master
分支腹暖,并完成合并汇在,最后刪除bug
分支
接下來繼續(xù)自己的工作,切換回工作分支脏答,例如:
git switch dev
查看狀態(tài)
git status
On branch dev
nothing to commit, working tree clean
發(fā)現(xiàn)是干凈的糕殉, 剛才的工作現(xiàn)場存到哪去了,執(zhí)行查看儲藏命令
git stash list
stash@{0}: WIP on dev: f52c633 add merge
此時需要恢復(fù)一下以蕴,有兩個辦法
一種是用git stash apply
恢復(fù)糙麦,但是恢復(fù)后,stash
內(nèi)容并不刪除丛肮,你需要用git stash drop
來刪除赡磅。
一種是方式是用git stash pop
,恢復(fù)的同時把stash
內(nèi)容也刪了
你可以多次stash
宝与,恢復(fù)的時候焚廊,先用git stash list
查看,然后恢復(fù)指定的stash
习劫,然后再刪除
git stash apply stash@{0}
git stash drop stash@{0}
注意:在master
分支上修復(fù)了BUG
后咆瘟,我們要想一想,dev
分支是早期從master
分支分出來的诽里,所以袒餐,這個BUG
其實在當(dāng)前dev
分支上也存在。
git cherry-pick
命令的作用,就是將指定的提交【commit
】應(yīng)用于其他分支灸眼, 不一定是提交的哈希值卧檐,分支名也是可以的,隨后會自動給當(dāng)前分支做了一次提交 焰宣。
git cherry-pick 4c805e2
17霉囚、多人遠程協(xié)作
查看遠程信息
git remote
origin
顯示更詳細的信息
git remote -v
origin git@github.com:michaelliao/learngit.git (fetch)
origin git@github.com:michaelliao/learngit.git (push)
從本地推送分支git push origin <branch-name>
,如果推送失敗匕积,先用git pull
拉取遠程的最新提交
git push origin master
在本地創(chuàng)建和遠程分支對應(yīng)的分支【本地和遠程分支的名稱最好一致】
git checkout -b branch-name origin/branch-name
建立本地分支和遠程分支的關(guān)聯(lián)
git branch --set-upstream branch-name origin/branch-name
多人協(xié)作的工作模式通常是這樣
首先盈罐,可以試圖用git push origin branch-name
推送自己的修改。
如果推送失敗闪唆,則因為遠程分支比你的本地更新盅粪,需要先用git pull
拉去試圖合并。
如果合并有沖突苞氮,則解決沖突湾揽,并在本地提交。
沒有沖突或者解決掉沖突后笼吟,再用git push origin
推送就能成功。
如果git pull
提示no tracking information
霸旗,則說明本地分支和遠程分支的鏈接關(guān)系沒有創(chuàng)建贷帮,用命令git branch --set-upstream-to origin/
。
18诱告、標(biāo)簽管理
創(chuàng)建標(biāo)簽 git tag <name>
git tag v1.0
查看所有標(biāo)簽
git tag
v1.0
標(biāo)簽總是和某個commit
掛鉤撵枢。如果這個commit
既出現(xiàn)在master
分支,又出現(xiàn)在dev
分支精居,那么在這兩個分支上都可以看到這個標(biāo)簽锄禽。
標(biāo)簽不是按時間順序列出,而是按字母排序的靴姿∥值可以用git show
查看標(biāo)簽信息
默認標(biāo)簽是打在最新提交的commit
上的。有時候佛吓,如果忘了打標(biāo)簽 宵晚,在打標(biāo)簽的時候帶上commit id
git tag v0.9 f52c633
創(chuàng)建帶有說明的標(biāo)簽 git tag -a <tagname> -m "blablabla..."
s
git tag -a v0.1 -m "message" 1094adb
刪除一個本地標(biāo)簽
git tag -d <tagname>
刪除一個遠程標(biāo)簽
git push origin :refs/tags/<tagname>
推送一個本地標(biāo)簽
git push origin <tagname>
推送全部未推送過的本地標(biāo)簽
git push origin --tags
19、忽略文件
在倉庫目錄下新建忽略文件.gitignore
GitHub
已經(jīng)為我們準備了各種配置文件维雇,只需要組合一下就可以使用了淤刃,gitignore配置
想添加一個文件到Git
,但發(fā)現(xiàn)添加不了吱型,原因是這個文件被.gitignore
忽略了逸贾,這個時候你可以強制提交
git add -f App.class
或者你發(fā)現(xiàn),可能是.gitignore
寫得有問題,需要找出來到底哪個規(guī)則寫錯了铝侵,可以用git check-ignore
命令檢查
git check-ignore -v App.class
.gitignore:3:*.class App.class 【`.gitignore`的第`3`行規(guī)則忽略了該文件掂名,】
如果想把指定文件排除在.gitignore
規(guī)則外,用!
# 排除所有.開頭的隱藏文件:
.*
# 排除所有.class文件:
*.class
# 不排除.gitignore和App.class:
!.gitignore
!App.class
20哟沫、配置別名
--global
參數(shù)是全局參數(shù)饺蔑,也就是這些命令在這臺電腦的所有Git
倉庫下都有用
例如
git config --global alias.st status
git config --global alias.ci commit
git config --global alias.unstage 'reset HEAD'
git config --global alias.lg "log --color --graph --pretty=format:'%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr) %C(bold blue)<%an>%Creset' --abbrev-commit"
以后就可以寫成
git st
git ci -m "message"
git unstage test.txt
git lg
配置Git
的時候,加上--global
是針對當(dāng)前用戶起作用的嗜诀,如果不加猾警,那只針對當(dāng)前的倉庫起作用。
每個倉庫的Git
配置文件都放在.git/config
文件中
[core]
repositoryformatversion = 0
filemode = true
bare = false
logallrefupdates = true
ignorecase = true
precomposeunicode = true
[remote "origin"]
url = git@github.com:michaelliao/learngit.git
fetch = +refs/heads/*:refs/remotes/origin/*
[branch "master"]
remote = origin
merge = refs/heads/master
[alias]
last = log -1
別名就在[alias]
后面隆敢,要刪除別名发皿,直接把對應(yīng)的行刪掉即可。
而當(dāng)前用戶的Git
配置文件放在用戶主目錄下的一個隱藏文件.gitconfig
中
[alias]
co = checkout
ci = commit
br = branch
st = status
[user]
name = Your Name
email = your@email.com