對(duì)命令取別名
---------取別名文件在C:/Users/Administrator/.gitconfig中可以看到。
$git config --blobal alias.ch checkout //以后用ch就相當(dāng)于用checkout了
設(shè)置vim編輯出現(xiàn)行號(hào)
:數(shù)字-----可定位到行
本地賬號(hào)的設(shè)置
git工具的git bash here窗口可當(dāng)linux端口操作,可用各程liunx命令,常用的命令
touch test.txt //創(chuàng)建文件
mkdir test //創(chuàng)建文件夾
pwd //查看當(dāng)前目錄
cd .. //返回到上一個(gè)文件夾
cd test //進(jìn)入test文件夾
ll /ls //顯示當(dāng)前文夾所有文件
vim test.txt //編輯文件,ESC退出當(dāng)前模式刀脏,:wq保存退出,:q退出
rm -rf 文件夾/文件名 //刪除文件
出現(xiàn)的問(wèn)題
-
kex_exchange_identification: Connection closed by remote host Connection closed by 20.205.243.166 port 22
具有可能是我的vpn啟動(dòng)了,退出可以正常箫津,還有可以往下看設(shè)置代理,也可處理宰啦。
github.com設(shè)置代理苏遥,提高訪問(wèn)速度
GitHub 是經(jīng)常的打不開(kāi),有時(shí)候克隆一個(gè)庫(kù)很久都不下載不下來(lái)赡模,很多時(shí)候都是超時(shí)無(wú)法下載田炭,這種情況下我們只有掛代理提高訪問(wèn)速度。
首先你得一個(gè)可用的梯子(代理)Elephant
如果 socks5(SSR)漓柑,你需要知道你本地的 socks5 代理 ip 地址和端口教硫,默認(rèn)打開(kāi)的話就是 127.0.0.1 端口 6986,然后使用此命令設(shè)置代理
git 有幾種傳輸協(xié)議辆布,在Github上主要用到的是Https和SSH協(xié)議瞬矩。所以我們要做的是對(duì)git 命令的https 以及ssh流量做代理。
Git代理有兩種設(shè)置方式锋玲,分別是全局代理和只對(duì)Github代理景用,建議只對(duì)github 代理。
代理協(xié)議也有兩種惭蹂,分別是使用http代理和使用socks5代理伞插,建議使用socks5代理割粮。
注意下面代碼的端口號(hào)需要根據(jù)你自己的代理端口設(shè)定,比如我的代理socks端口是6987.
全局設(shè)置(不推薦)
#使用http代理
git config --global http.proxy http://127.0.0.1:58591
git config --global https.proxy https://127.0.0.1:58591
#使用socks5代理
git config --global http.proxy socks5://127.0.0.1:51837
git config --global https.proxy socks5://127.0.0.1:51837
只設(shè)置 Github 的代理
git config --global http.https://github.com.proxy socks5://127.0.0.1:6986
git config --global https.https://github.com.proxy socks5://127.0.0.1:6986
取消代理
git config --global --unset http.proxy
git config --global --unset https.proxy
https連接的github.com 一個(gè)token.
//用戶名 xiongshaowen
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
設(shè)置ssh代理(終極解決方案)
https代理存在一個(gè)局限媚污,那就是沒(méi)有辦法做身份驗(yàn)證穆刻,每次拉取私庫(kù)或者推送代碼時(shí),都需要輸入github的賬號(hào)和密碼杠步,非常痛苦氢伟。
設(shè)置ssh代理前,請(qǐng)確保你已經(jīng)設(shè)置ssh key幽歼《渎啵可以參考[在 github 上添加 SSH key完成設(shè)置更進(jìn)一步是設(shè)置ssh代理。只需要配置一個(gè)config就可以了甸私。
# Linux诚些、MacOS
vi ~/.ssh/config
# Windows
到C:\Users\your_user_name\.ssh目錄下,新建一個(gè)config文件(無(wú)后綴名)
將下面內(nèi)容加到config文件中即可
對(duì)于windows用戶皇型,代理會(huì)用到connect.exe诬烹,你如果安裝了Git都會(huì)自帶connect.exe,如我的路徑C:\APP\Git\mingw64\bin\connect
#Windows用戶弃鸦,注意替換你的端口號(hào)和connect.exe的路徑
ProxyCommand "C:\Program Files\Git\mingw64\bin\connect" -S 127.0.0.1:6986 -a none %h %p
#MacOS用戶用下方這條命令绞吁,注意替換你的端口號(hào)
#ProxyCommand nc -v -x 127.0.0.1:6986 %h %p
Host github.com
User git
Port 22
Hostname github.com
# 注意修改路徑為你的路徑
IdentityFile "C:\Users\Administrator\.ssh\id_rsa"
TCPKeepAlive yes
Host ssh.github.com
User git
Port 443
Hostname ssh.github.com
# 注意修改路徑為你的路徑
IdentityFile "C:\Users\Administrator\.ssh\id_rsa"
TCPKeepAlive yes
保存后文件后測(cè)試方法如下,返回successful之類的就成功了唬格。
測(cè)試是否設(shè)置成功
ssh -T git@github.com
之后都推薦走ssh拉取代碼家破,再github 上選擇clone地址時(shí),選擇ssh地址购岗,入下圖汰聋。這樣git push 與 git clone 都可以直接走代理了,并且不需要輸入密碼喊积。
很多朋友配置代理之后烹困,可以正常訪問(wèn)github 網(wǎng)頁(yè)了,但是發(fā)現(xiàn)在本地克隆github倉(cāng)庫(kù)(git clone xxx)時(shí)還是報(bào)網(wǎng)絡(luò)錯(cuò)誤乾吻。那是因?yàn)間it clone 沒(méi)有走你的代理髓梅,所以需要設(shè)置git走你的代理才行。
設(shè)置代理之前
如果在終端terminal命令行下載軟件包速度不快溶弟,并不是代理不行女淑,而是在終端terminal也需要進(jìn)行相應(yīng)的配置代理,同樣的在命令行中g(shù)it clone 某某工程時(shí)辜御,即使終端設(shè)置了代理鸭你,GitHub也要再配置一遍代理,接下來(lái)看操作,命令行敲起來(lái)袱巨。
[user]
name = your_name
email = your_email
[http]
proxy = socks5://127.0.0.1:1080
[https]
proxy = socks5://127.0.0.1:1080
遠(yuǎn)程庫(kù)修改刪除操作
-
首先本地建一個(gè)文件mygitremote阁谆,git init把該文件夾納入版本庫(kù)管理,建六個(gè)文件如下圖愉老。
image.png - 與遠(yuǎn)程庫(kù)建立關(guān)聯(lián)场绿,并把所有文件放到暫存區(qū)
git remote add oirgin https://github.com/xiongshaowen/mygitremote.git
git add .
-
修改
image.png
一。提交嫉入,修改焰盗,撤回修改
-----如果某個(gè)文件,已提交咒林,并且對(duì)其進(jìn)行修改熬拒,可以放棄修改,還原到提交(剛剛提交的)狀態(tài)垫竞。
git add . //把所有文件都放進(jìn)暫存區(qū)staged
git commit -m "提交所有文件到對(duì)象區(qū)"
vi hello.txt //修改hello.txt ,加內(nèi)容:如world hello澎粟,這時(shí)文件又回到工作區(qū)
git checkout -- hello.txt //撤回修改
cat hello.txt //查看一下文件內(nèi)容,可以看到?jīng)]了world hello
-----------------------------------------------提交后查詢當(dāng)前情形-------------------------------------
Administrator@10_0_12_3 MINGW64 ~/Desktop/githubtest/mygitremote (master)
$ git status
On branch master
nothing to commit, working tree clean
---------------------------------修改hello.txt沒(méi)有add的情形--------------------------------------------------
$ git status
On branch master
Changes not staged for commit:
(use "git add <file>..." to update what will be committed)
(use "git restore <file>..." to discard changes in working directory)
modified: hello.txt
-----------------------------------------撤回修改查看hello.txt--------------------------------------
$ cat hello.txt
---------新建一個(gè)文件world.txt,馬上放到暫存區(qū)欢瞪,git add world.txt,可以reset或cache撤回到工作區(qū)的命令如下活烙,如同上面修改文件沒(méi)有add的一樣。
touch world.txt
git add world.txt
git reset head world.txt
二遣鼓,刪除已提交的文件
1---git rm命令刪除
----use "git restore --staged <file>..." to unstage表示刪除的文件可用git restore --staged xxx回到工作區(qū)啸盏,即表明它現(xiàn)在在暫存區(qū)stage.現(xiàn)在只有兩個(gè)操作了,要么再提交(徹底刪除)譬正,要么就放在暫存(看不見(jiàn))
git rm 文件名
例:刪除b.txt健民,后查看狀態(tài)抒巢,顯示b.txt在暫存區(qū)了
$ git rm b.txt
rm 'b.txt'
$ git status
On branch master
Changes to be committed:
(use "git restore --staged <file>..." to unstage)
deleted: b.txt
----刪除后悔操作,前提是沒(méi)有提交
------可以先用git status查看當(dāng)前庫(kù)的中文件狀態(tài)秉犹,看沒(méi)沒(méi)有‘changes to be committed:下面的deleted:xxxx有什么文件“崇堵,如有狰贯,則可后悔。
$git reset HEAD hello.txt //恢復(fù)到工作
$git checkout -- hello.txt //回到提交的狀態(tài),后悔了涵紊。
2---rm 操作系統(tǒng)刪除
-----該刪除會(huì)把文件放到工作區(qū)了傍妒,想要徹底刪除,則要提交到暫存摸柄,再commit.
三颤练,重命名 git mv xxx xxx和操作系統(tǒng)mv xxx xxx
1---git mv
-----本質(zhì)是,先移動(dòng)文件驱负,復(fù)制了一份嗦玖,再刪除舊文件,涉及到了兩個(gè)文件跃脊,從這可以看出宇挫,可以恢復(fù)舊文件。
例:我重命hellowrld.txt 為hello.txt
$ git mv hellowrld.txt hello.text
$ git status
On branch master
Changes to be committed:
(use "git restore --staged <file>..." to unstage)
renamed: hellowrld.txt -> hello.text
恢復(fù)舊文件(后悔了)hellowrld.txt
$git reset HEAD hellowrld.txt //回到工作區(qū)匾乓,下面也提示捞稿,可以add 了
$ git status
On branch master
Changes to be committed:
(use "git restore --staged <file>..." to unstage)
new file: hello.text
Changes not staged for commit:
(use "git add/rm <file>..." to update what will be committed)
(use "git restore <file>..." to discard changes in working directory)
deleted: hellowrld.txt
$git checkout -- hellowrld.txt //回到提交的狀態(tài),新文件還在暫存區(qū)拼缝,可以提交它
$ git status
On branch master
Changes to be committed:
(use "git restore --staged <file>..." to unstage)
new file: hello.text
--------------------------------------------------------------------------------
$ ls
a.txt abc.txt hello.text hello.txt hellowrld.txt wrold.txt
2---操作系統(tǒng) mv xxx xxx
-------操作后娱局,兩文件都在工作區(qū)了,可以先放到暫存區(qū)咧七,再提交衰齐,但舊文件刪除了,不能恢復(fù)了继阻。
$ mv hello.text hellonew.txt
$ git status
On branch master
Changes not staged for commit:
(use "git add/rm <file>..." to update what will be committed)
(use "git restore <file>..." to discard changes in working directory)
deleted: hello.text
Untracked files:
(use "git add <file>..." to include in what will be committed)
hellonew.txt
no changes added to commit (use "git add" and/or "git commit -a")
四耻涛,重命名,提交的注釋信息(-m后面的信息)
------思路:先查看提交信息
$git log -2 //查看最近兩次的提交
Administrator@10_0_12_3 MINGW64 ~/Desktop/githubtest/mygitremote (master)
$ git log -2
commit 826d1bbf637190b07f01f675848c4c1dd84400b1 (HEAD -> master)
Author: xiongshaowen <65179334@qq.com>
Date: Sat Apr 8 15:25:28 2023 +0800
fsdaf
commit e3fb20214b2f10bc88344c5fc4d2009ab79f50b0
Author: xiongshaowen <65179334@qq.com>
Date: Sat Apr 8 15:18:57 2023 +0800
提交新文件
------再后:修改之(下面是修改最近的一次)
$git commit --amend -m '修改’
[master 0c1eb08] modify
Date: Sat Apr 8 15:25:28 2023 +0800
1 file changed, 0 insertions(+), 0 deletions(-)
rename hello.text => hellonew.txt (100%)
$ git log -2 //查看最近的兩次提交信息
commit 0c1eb083fe77cf86b3e57ba97399c2dfe3583924 (HEAD -> master)
Author: xiongshaowen <65179334@qq.com>
Date: Sat Apr 8 15:25:28 2023 +0800
修改
commit e3fb20214b2f10bc88344c5fc4d2009ab79f50b0
Author: xiongshaowen <65179334@qq.com>
Date: Sat Apr 8 15:18:57 2023 +0800
提交新文件
五瘟檩,忽略
-----發(fā)布項(xiàng)目時(shí)抹缕,我們提交只是提交代碼如java文件,而一些配置文件是不用提交的墨辛,因?yàn)槿缟蠄D中a.properties配置文件里的路徑可是不一樣的卓研。我放在resources中,別人可能放在其它地方睹簇。所有我們上傳時(shí)要忽略它奏赘,不上傳。
例:模擬忽略文件a.properties
首先:,建兩個(gè)文件a.properties,.gitignore,用git status太惠,可以看到兩個(gè)沒(méi)有add的文件
$touch a.properties
$touch .gitignore //忽略之配置文件
$git status //可以看到兩個(gè)文件
$ git status //可以看到兩個(gè)文件處于add之前狀態(tài)
On branch master
Untracked files:
(use "git add <file>..." to include in what will be committed)
.gitignore
a.properties
nothing added to commit but untracked files present (use "git add" to track)
***然后:我們編輯.gitignore文件磨淌,加上a.properties,:wq保存退出凿渊,再git status,不認(rèn)識(shí)a.properties文件了(這時(shí)是沒(méi)有add的時(shí)候)
$vim .gitignore
------------------------------------------------------------------------------------
a.properties //或?qū)?*.properties通配符*表示任意長(zhǎng)度的任意字符串
------------------------------------其它常用的正則表達(dá)式
*.properties
!b.properties //不忽略b.properties,!常與*一起用梁只。
dir/: //忽略dir目錄中的所有文件
dir/*.txt //飯略dir下的所有txt
dir/*/*.txt
dir/**/*.txt //忽略任意級(jí)別目錄下的所有txt
空目錄 //默認(rèn)忽略
-------------------------------------------------git status-------------------
$ git status
On branch master
Untracked files:
(use "git add <file>..." to include in what will be committed)
.gitignore
nothing added to commit but untracked files present (use "git add" to track)
分支管理
-----分支在新建的時(shí)刻缚柳,它里的內(nèi)容與創(chuàng)建分支的分支一樣,如master,后面就各自獨(dú)立操作敛纲。如以master為根據(jù)創(chuàng)建分支喂击,此時(shí)新的分支內(nèi)容與master一樣,后面就是各不相干淤翔。
-
新建分支
-----新建的那時(shí)刻翰绊,xxxx分支也具有abc...的文件。后來(lái)互不相干旁壮。
image.png
例:以master創(chuàng)建new_branch分支监嗜,并切換到new_branch,并馬上查看有什么文件
$git branch //查看分支情況抡谐,帶*號(hào)的為當(dāng)前分支
$git branch new_branch //只創(chuàng)建分支
$git checkout new_branch //只切換分支
$ git checkout -b new_branch //創(chuàng)建并切換到分支
Switched to a new branch 'new_branch'
Administrator@10_0_12_3 MINGW64 ~/Desktop/githubtest/mygitremote (new_branch)
$ ls //在new_branch中查看有什么文件裁奇,可以看到相當(dāng)于復(fù)制一份master的內(nèi)容
a.properties abc.txt hellonew.txt wrold.txt
a.txt hello.txt hellowrld.txt
注意:創(chuàng)建分支,并切換后麦撵,如果創(chuàng)建它的地方?jīng)]有內(nèi)容,(master沒(méi)有內(nèi)容)刽肠,再切換回master不成功.
在HEAD指回master分支后,需要將工作目錄恢復(fù)到master分支所指向的內(nèi)容免胃。但是由于你從開(kāi)始一直在develop分支上進(jìn)行操作音五,master分支對(duì)應(yīng)的工作目錄相當(dāng)于還什么都沒(méi)有,這樣就出現(xiàn)匹配不到任何文件羔沙。
-------如何解決
你只需要在初始化一個(gè)倉(cāng)庫(kù)后躺涝,先在master分支上進(jìn)行一些commit操作,比如增加一個(gè)README.md文件扼雏,這樣就真正創(chuàng)建了一個(gè)master分支坚嗜。
- 刪除或增加分支內(nèi)容,再切換分支诗充,看看情況
假設(shè)當(dāng)前分為new_branch,創(chuàng)建b.properties,c.properties,再add . 再commit提交
$touch b.properties
$touch c.properties
$git add .
$git commit -m "bc.properties"
- 分支刪除 git branch -d new_branch
注意:刪除分支苍蔬,以下情況不可刪除
一,不可自已刪除自已
二蝴蜓,沒(méi)有合并內(nèi)容的分支建議不刪除,為了保護(hù)數(shù)據(jù)银室,可以強(qiáng)刪除用大寫-D。
-----如上励翼,new_branch增加了兩個(gè)文件,此時(shí)在master下刪除new_branch會(huì)出錯(cuò)
$ git branch -d new_branch
error: The branch 'new_branch' is not fully merged.
If you are sure you want to delete it, run 'git branch -D new_branch'.
$git merge new_branch //合并分支辜荠,后可以再小寫-d刪除汽抚,合并后的master內(nèi)容是兩個(gè)分支合并
git branch -v查看每個(gè)分支的提交情況
刪除分細(xì)節(jié):
1---如果在分支A中建一個(gè)文件(刪除,修改)伯病,沒(méi)有(add,commit),則切換到主分區(qū)(如master)中造烁,可以看到A分支創(chuàng)建的文件操作否过。
2---如果如果在分支A中建一個(gè)文件,有(add,commit),則切換到主分區(qū)(如master)中惭蟋,不可以看到A分支創(chuàng)建的文件操作苗桂。
3---如果在分支A中建一個(gè)文件,沒(méi)有(add,commit),則切換到主分區(qū)(如master)中告组,可以在主分區(qū)中小寫-d刪除A分支
分支的合并與沖突
- 分支沒(méi)有沖突的合并煤伟。
----分支:是一個(gè)commit鏈接,一條長(zhǎng)鏈木缝,通過(guò)sha1值鏈起來(lái)便锨,下一個(gè)分支可以通過(guò)sha1找上父分支。
image.png
---HEAD是一個(gè)指針我碟,一直指向commit,所以通過(guò)它能回退提交的版本放案。
image.png
例:有一個(gè)分支鏈條,剛開(kāi)始git init自創(chuàng)建一個(gè)主分區(qū)矫俺,HEAD指向它和它的提交版本吱殉,這可以從.git文件夾的HEAD文件中看到ref: refs/heads/master
,同時(shí)創(chuàng)建一個(gè)a.txt文件,再add . ,commit -m "init".
$mkdir mygit
$cd mygit
$git init
$cat .git/HEAD
ref: refs/heads/master
$git add .
$git commit -m "init"
然后:建一個(gè)分dev,且切換到dev分支厘托,在dev中創(chuàng)建一個(gè)文件b.txt,并提交commit -m "dev1",再git log查看HEADR指向,表明HEAD是跟著commit走的
$ git checkout -b dev
Switched to a new branch 'dev'
$ cat .git/HEAD
ref: refs/heads/dev
$ git log //在dev分支中可以看到此時(shí)HEADR指向dev,dev再指向master的sha1值(239171.……)
commit 2391712725dfaf3381ad45f5ff032d2b0bb56e05 (HEAD -> dev, master)
Author: xiongshaowen <65179334@qq.com>
Date: Sat Apr 8 22:00:40 2023 +0800
init
$vim b.txt //輸入b
$git add .
$git commit -m "dev1"
$git log
commit 5f7d2cb82887dea618eed85d68dfc788e112b412 (HEAD -> dev)
Author: xiongshaowen <65179334@qq.com>
Date: Sat Apr 8 22:10:22 2023 +0800
dev1
commit 2391712725dfaf3381ad45f5ff032d2b0bb56e05 (master)
Author: xiongshaowen <65179334@qq.com>
Date: Sat Apr 8 22:00:40 2023 +0800
init
$ git checkout master // 切換到master分支友雳,查看得到HEAD
Switched to branch 'master'
Administrator@10_0_12_3 MINGW64 ~/Desktop/mygit (master)
$ git log
commit 2391712725dfaf3381ad45f5ff032d2b0bb56e05 (HEAD -> master)
Author: xiongshaowen <65179334@qq.com>
Date: Sat Apr 8 22:00:40 2023 +0800
init
dev分支再提交一次
$vim a.txt //修改主分區(qū)創(chuàng)建的文件,加:ab
$git add .
$git commit -m "dev2"
[dev 707e18f] dev2
現(xiàn)在master落后催烘,兩步了,又不沖突沥阱,為了追上dev,可以合并dev兩次提交的版本,這叫快進(jìn)Fast forward
$git checkout master //切換到主分區(qū)
$git merge dev //合并分支dev
Git在merge時(shí)伊群,默認(rèn)使用fast forward,也可設(shè)置不用,git merge –no-ff 分支
1考杉, 兩個(gè)分支合并禁用fast forward,不會(huì)歸于一點(diǎn)commit,主動(dòng)發(fā)起合并的分支,會(huì)前進(jìn)一步)
2舰始, 分支信息完整(不會(huì)丟失分支信息)崇棠,可用git log –graph查看commit信息,就知道了丸卷。
----現(xiàn)在我們枕稀,又到dev分支進(jìn)行兩次提交 dev3,dev4.又回到master合并dev3,dev4,這次帶參數(shù)合并,禁用fast forward
$git checkout dev
$vi a.txt //加點(diǎn)內(nèi)容
$git add .
$git commit –m “dev3”
$vi b.txt
$git add .
$git commit –m “dev4”
$git checkout master
$git merge --no-ff dev
從下圖可以看出,master發(fā)起的兩合并竭业,是不同的锈玉,第一次歸于一點(diǎn)了(在dev2鏈上,而第二次發(fā)起合并哆档,前進(jìn)了一步,綠線也指示出了分支信息保存了下來(lái))
- 合并時(shí)沖突住闯,要處理沖突
首先:建立沖突場(chǎng)景,分別在上次合并后的各分支中都修改a.txt的第二行內(nèi)容(兩個(gè)分支共享一個(gè)內(nèi)容)瓜浸,都各自add . commit .
//假設(shè)當(dāng)前在dev分f支
$vim a.txt //第二加 dev
$git add .
$git commit -m "dev"
//切換到 master
$git checkout master
$vim a.txt //第二加 master
$git add .
$git commit -m "master"
然后:到任 一分支中發(fā)起合并澳淑,我選master中發(fā)起,發(fā)起后插佛,會(huì)產(chǎn)生沖突杠巡,如下內(nèi)容。
//假設(shè)當(dāng)前在master分支雇寇,發(fā)起合并
$ git merge dev
Auto-merging a.txt
CONFLICT (content): Merge conflict in a.txt
Automatic merge failed; fix conflicts and then commit the result.
再然后:處理沖突氢拥,即我們可以在一分支中(發(fā)起合并的)用vim a.txt 修改即可,刪除>>>>>等字樣谢床。
$vim a.txt
$git add .
$git com
處理完沖突后,再add . commit ,再合并就沒(méi)問(wèn)題了兄一,合了后:master會(huì)把dev修改的a.txt內(nèi)容同步進(jìn)它的a.txt文件,相當(dāng)于master兩次修改提交识腿。還有出革,如果此時(shí)我們?cè)倩氐絛ev分支中,來(lái)合并master不會(huì)出錯(cuò)了渡讼,因?yàn)閙aster又前進(jìn)了一步骂束,事實(shí)上,只要兩個(gè)分支處在同一時(shí)刻中(每一次merge后成箫,處在同一個(gè)時(shí)刻中展箱,剛剛創(chuàng)建分支時(shí),兩分支也處同一時(shí)刻)蹬昌,快進(jìn)合并就不會(huì)產(chǎn)生沖突混驰,如果同一時(shí)刻都有修改同一內(nèi)容,再提交(次數(shù)不限皂贩,合并都是以最近一次提交為依據(jù)合并)栖榨,再任誰(shuí)合并誰(shuí)都會(huì)產(chǎn)生沖突
分支的內(nèi)容版本管理,與分支重命名等
1.版本回退明刷,即版本穿梭
-----我們每執(zhí)行一次commit婴栽,就產(chǎn)生一個(gè)版本。執(zhí)行g(shù)it log可以看到當(dāng)前所有的提交記錄辈末,也就是每個(gè)版本的信息愚争。每個(gè)版本都有一個(gè)commit id,版本回退的時(shí)候挤聘,只需要執(zhí)行g(shù)it reset --hard commit_id(commit_id不需要輸完轰枝,輸入前6位即可),就可以回退到對(duì)應(yīng)的版本中组去。
------github有一個(gè)HEAD指針狸膏,指向當(dāng)前版本。如下圖添怔,最上面的是最新的版本湾戳,執(zhí)行版本回退之后,github只是將HEAD指針指向了歷史版本而已广料。
------如果我們回退了版本之后砾脑,后悔了,又想恢復(fù)到較新的版本艾杏,怎么辦呢韧衣?由于這個(gè)時(shí)候執(zhí)行g(shù)it log是看不到較新版本的記錄的,需要執(zhí)行g(shù)it reflog才行购桑。這個(gè)時(shí)候我們就得到了所有版本的commit_id畅铭,再執(zhí)行g(shù)it reset --hard commit_id,就可以吃上后悔藥勃蜘,恢復(fù)到較新版本了硕噩。
git log -number //會(huì)顯示最近三提交版信息
git reflog //會(huì)顯示所有版本id,包括已回退到版本前后版本id缭贡,因回版本修改了炉擅,后,git log已經(jīng)不顯示回退之前的版本了阳惹。
git reset --hard HEAD //上一個(gè)版本
git reset --hard HEAD^ //回退到下一個(gè)版本谍失,加多個(gè)^可以退回到多個(gè)下一版
git reset --hard HEAD~100 //則是往前倒數(shù)第100個(gè)版本
git reset --hard commit_id //回到版本號(hào)(sha1值的前6位即可)的位置,一般先要用git reflog查詢版本號(hào)莹汤。
checkout做版本穿梭快鱼,它穿棱后,成為游離狀態(tài)detached纲岭,這時(shí)若修改了內(nèi)容一定要add . commit,不然的話穿棱不回去抹竹,游離狀態(tài)是創(chuàng)建分支的最好時(shí)機(jī)***
例:對(duì)分支dev做了四次修改,提交荒勇,有多個(gè)版本柒莉。然后checkout穿棱到版本三,版本三游離出去了沽翔,獨(dú)立的兢孝。
$git checkout 版本三sha1值 //游離了,通過(guò)git log 查詢到commit_jd(sha1)
$vi a.txt
$git add .
$git commit -m "游離時(shí)修改了內(nèi)容仅偎,必須提交"
$git checkout mybranch 2735603 //創(chuàng)建分支跨蟹,并命名,帶上sha1值橘沥,該值在上面的穿棱時(shí)有給出建議
$git checkout master //回到現(xiàn)在窗轩,
2.管理修改(vi 內(nèi)容)
不管是在暫存區(qū),還是對(duì)象座咆,只要一vi修改痢艺,就會(huì)回到工作區(qū)仓洼,但在暫存區(qū)時(shí),再修改堤舒,它只是復(fù)制一份到工作區(qū)中色建,暫存區(qū)的不會(huì)丟失,只有再add .就會(huì)覆蓋舌缤,可再提交箕戳,對(duì)象區(qū)的一修改不移到工作區(qū)了。
舉例:建一個(gè)版本庫(kù)mygittest ,git init ----vi a.txt 輸入aaa,---->git add . ----git commit -m 'init'------>vi a.txt 輸入內(nèi)容bbb国撵,這時(shí)陵吸,對(duì)象區(qū)中沒(méi)有內(nèi)容了。我又把a(bǔ).txt 放到暫存區(qū)介牙,git add .再又修改vi a.txt輸入ccc壮虫,這時(shí)就是如下圖所示的情情了。有兩份a.txt了,一份在暫存區(qū)耻瑟,可直接提交旨指,一份在工作區(qū)(unstage)可以add 了。但查詢內(nèi)容是工作區(qū)的cat a.txt
注意喳整!可用:git reset HEAD a.txt谆构,可以把a(bǔ).txt推回到工作區(qū),相當(dāng)于移動(dòng)
$ cat a.txt
aaaa
bbb
ccc
$ git status
On branch master
Changes to be committed:
(use "git restore --staged <file>..." to unstage)
modified: a.txt
Changes not staged for commit:
(use "git add <file>..." to update what will be committed)
(use "git restore <file>..." to discard changes in working directory)
modified: a.txt
如上情況框都。1.放棄工作區(qū)修改
$git checkout a.txt
$git commit -m "放棄工作區(qū)的ccc搬素,再提交是暫存區(qū)的那份,沒(méi)有ccc內(nèi)容"
******如上情況魏保。2.放棄對(duì)象區(qū)修改***
----這個(gè)時(shí)候熬尺,內(nèi)容只是存在于對(duì)象區(qū)中,這個(gè)時(shí)候直接執(zhí)行g(shù)it checkout -- a.txt即可(即把版本庫(kù)---對(duì)象區(qū)的a.txt簽出到工作區(qū))谓罗。注意"--"不能少粱哼,不然就是切換分支了,或是把工作區(qū)的丟掉。再執(zhí)行g(shù)it checkout -- a.txt將修改從工作區(qū)中刪除
$vi a.txt //輸入xxxx
$git checkout -- a.txt //回車后檩咱,仍是對(duì)象區(qū)中上次提交的樣子揭措,等于是沒(méi)修改
3.刪除文件,如何恢復(fù)
----假設(shè)我們分支里有一個(gè)test.txt文件(即已經(jīng)commit到分支)刻蚯,這個(gè)時(shí)候我們?cè)诠ぷ鲄^(qū)中把test.txt刪除了绊含,該如何恢復(fù)呢?由于版本庫(kù)中還有test.txt炊汹,我們只要把它簽出即可:git checkout -- test.txt躬充。當(dāng)然還有另一種情況,就是我們確實(shí)是要?jiǎng)h掉test.txt的,那么我們需要先執(zhí)行g(shù)it rm test.txt充甚,再執(zhí)行g(shù)it commit -m "xxx"即可以政。這和新增修改是一樣的。
4.分支管理
方法1津坑,創(chuàng)建分支的同時(shí)妙蔗,切換到新建分支:
git checkout -b dev # dev是新建分支名
方法2:,先新建分支疆瑰,再切換:
git branch dev
git checkout dev
git branch //查看當(dāng)前分支
5.合并分支
想把dev合并到master分支,那么需要先切換到master昙啄,然后再merge:
git checkout master
git merge dev
上面的方式是Fast-forward模式穆役,即“快進(jìn)模式”,直接把master指向當(dāng)前的提交梳凛。這種方式速度快耿币,但是有一個(gè)缺點(diǎn),就是當(dāng)我們把dev分支刪除后韧拒,dev分支的信息就丟失了淹接。如果希望保留dev分支信息,可以用--no-ff方式:
git checkout master
git merge --no-ff -m "merge with no-ff" dev
這樣相當(dāng)于新建了一個(gè)commit(看到-m這個(gè)參數(shù)了嗎)叛溢,通過(guò)下面的命令塑悼,我們可以看到這個(gè)commit的信息:下面的顯示版本信息比git log 顯示的信息簡(jiǎn)單明了,一行顯示一個(gè)版本信息楷掉。
git log --graph --pretty=oneline --abbrev-commit
這個(gè)時(shí)候就可以把dev分支刪除了:
git branch -d dev
6.分支重命名厢蒜,master都可重命名,當(dāng)然了不這樣做
$git branch -m master master2
7.stash保存現(xiàn)場(chǎng)
一,建議(規(guī)范):在功能沒(méi)有開(kāi)發(fā)完畢之前烹植,不要commit
二斑鸦,規(guī)定:在沒(méi)有開(kāi)發(fā)完畢之前,沒(méi)有commit之前草雕,不能切換checkout 分支(不在同一個(gè)commit階段---merge合并后了的時(shí)候巷屿,是同一個(gè)階段),這時(shí)可以用stash保存現(xiàn)場(chǎng),再切換墩虹。
例:我正在dev分支中開(kāi)發(fā)嘱巾,沒(méi)有完畢, 但經(jīng)理跟我說(shuō)master分支有任務(wù)要做败晴,很急浓冒,我就馬上切換到master去,又不可提交尖坤,因?yàn)闆](méi)做完稳懒,所以在此時(shí)的dev中保存現(xiàn)現(xiàn)場(chǎng)
$git stash [現(xiàn)場(chǎng)名] //[]表可選
$git checkout master //做了活,又回到dev中,此時(shí)剛剛沒(méi)提交的東西看不見(jiàn),這時(shí)我們要恢復(fù)現(xiàn)場(chǎng)
$git checkout dev
$git stash list //查看現(xiàn)場(chǎng)列表场梆,如果只有一個(gè)場(chǎng)墅冷,直接下條命令即可恢復(fù)
$git stash pop //還原現(xiàn)場(chǎng),并刪除現(xiàn)場(chǎng)
$git stash apply //還原現(xiàn)場(chǎng)或油,并保存現(xiàn)場(chǎng) ,若要?jiǎng)h除則用 git drop stash@{數(shù)字}
$git drop stash@{0} //刪除指定的現(xiàn)場(chǎng)
-----------------------------------------------------------多個(gè)現(xiàn)場(chǎng)時(shí)---------------------------------------------
$git stash save my1
$git checkout master
$git checkout dev
$git stash list
$git stash apply stash@{1} //還原再撥寞忿,不刪除現(xiàn)場(chǎng)
***保存現(xiàn)場(chǎng)沖突----如兩次退出前保存現(xiàn)地時(shí),修改了同一文件同一行顶岸,處理:vi ***
8.tag標(biāo)簽,給版本寫標(biāo)簽
--------常用于commit后腔彰,
tag標(biāo)簽 :適用于整個(gè)項(xiàng)目,和具體的分支沒(méi)關(guān)系
git tag xxx
git tag -a xxx -m "xxxx"
查看標(biāo)簽git tag
刪除標(biāo)簽 git tag -d 標(biāo)簽名
$git tag -d v1.0 //刪除標(biāo)簽
例:現(xiàn)在庫(kù)中有文件a.txt辖佣,兩個(gè)分支dev master.我在dev中修改了兩次文件霹抛,提交了兩次,也分別打了兩個(gè)標(biāo)簽卷谈。下面看操作杯拐。
$git checkout dev
$vi a.txt //輸入tag
$git add .
$git commit -m "first tag"
$git tag v1.0 //創(chuàng)建標(biāo)簽1,名為v1.0
$vi a.txt //輸入tag2
$git add .
$git commit -m "second tag"
$git tag v2.0 //創(chuàng)建標(biāo)簽2世蔗,名為v2.0
$git tag -a v2.0 -m "release Tag" //創(chuàng)建標(biāo)簽的另一種形式端逼,有注釋信息,表明發(fā)布版
$git tag //查詢所有標(biāo)簽
v1.0
v2.0
$git tag -1 "v*" //模糊查詢標(biāo)簽污淋,這是查一個(gè)顶滩,名為v開(kāi)頭的所有標(biāo)簽
v1.0
切換到master,再查看標(biāo)簽芙沥,可以看所有標(biāo)簽诲祸,表明標(biāo)簽適用于整個(gè)庫(kù)
9.blame:責(zé)任
$git blame a.txt //查看a.txt的所有提交commit sha1值,以及每一行的作者,可以用于追責(zé)
^967737a (xiongshaowen 2023-04-10 09:24:24 +0800 1) aaaa
5ba155c2 (xiongshaowen 2023-04-10 09:43:29 +0800 2) bbb
10.diff差異性
-----diff是linux命令而昨,本身不是git的救氯。可以在linux終端式的窗口中用歌憨。
例如:下面庫(kù)中兩個(gè)文件a.txt,b.txt.,再用diff a.txt b.txt后
$diff -u a.txt b.txt
--- a.txt 2023-04-10 12:58:45.951439500 +0800 //---表示源文件着憨,+++表示對(duì)比的文件,其它是修改日期時(shí)間
+++ b.txt 2023-04-10 12:58:45.951439500 +0800
@@ -1,6 +1,7 @@ //-表源务嫡,+表對(duì)比的甲抖,從第一行開(kāi)始比較
aaaa
bbb
-cc //內(nèi)容上的加減號(hào)表,加上內(nèi)容到源文件心铃,從源文件減去內(nèi)容准谚,兩個(gè)文件內(nèi)容一樣了。
+ccc
dd
hello dev
-??????
+hello dev2
+hello dev3
\ No newline at end of file
-----git diff :暫存區(qū) 和工作區(qū)的差異去扣,工作區(qū) 和 某個(gè)對(duì)象區(qū)的差異柱衔,不是不同文件的差距。
例:暫存區(qū),工作區(qū)的差距(注:左源唆铐,右目標(biāo))
vi a.txt //輸入 first line.....
git add .
git commit -m "init"
vi a.txt //輸入第二行 sencod line...哲戚,此時(shí)把對(duì)象區(qū)的a.txt復(fù)制到工作區(qū)了
git add . //此時(shí)此刻,a.txt回到暫存區(qū)了
vi a.txt //輸入第三行 three line ....,此時(shí)艾岂,把a(bǔ).txt復(fù)制一份到工作區(qū)了顺少,不是移動(dòng)
現(xiàn)在比較暫存區(qū)和工作區(qū)的差異
$git diff
warning: in the working copy of 'a.txt', LF will be replaced by CRLF the next time Git touches it
diff --git a/a.txt b/a.txt
index 05e3fe0..1e0185d 100644
--- a/a.txt
+++ b/a.txt
@@ -1,2 +1,3 @@
first line...
second line... //表明兩區(qū)的前兩行是一樣的,因?yàn)榍懊鏇](méi)有符號(hào)(+王浴,-)
+three line... //+表明暫存區(qū)只要加three line...后脆炎,都一樣了。
現(xiàn)在比較對(duì)象區(qū)和工作區(qū)的差異
vi a.txt //輸入 111111111
$git add .
$git commit -m "init"
$vi a.txt //輸入 2222222
$git diff sha1值(“init‘的)
現(xiàn)在比較 最新的對(duì)象區(qū)和工作區(qū)的差異(HEAD)氓辣,一定要注意是:左源腕窥,右目
$git add .
$git commit -m "init2" //把上次工區(qū)的222222提交到對(duì)象區(qū)
$vi a.txt //輸入3333333,再馬上比較之筛婉,
$ git diff HEAD
warning: in the working copy of 'a.txt', LF will be replaced by CRLF the next time Git touches it
diff --git a/a.txt b/a.txt
index 1640270..ce427e6 100644
--- a/a.txt
+++ b/a.txt
@@ -1,2 +1,3 @@
11111111111
22222222222
+33333333333
git diff --cached commit的sha1值 : 對(duì)象區(qū)和 暫存區(qū)的差異
git diff --cached HEAD : 最新對(duì)象區(qū)和 暫存區(qū)的差異
本地到遠(yuǎn)程的操作(推送,拉锐伞)
push:本地->github
pull:github->本地 爽撒, pull = fetch + merge
rm -rf * :當(dāng)前目錄中的文件、子文件目錄全部刪除(不會(huì)刪除隱藏文件响蓉、不過(guò)回收站)
.....rm ..... -rf / ......:不要執(zhí)行硕勿,刪除整個(gè)計(jì)算機(jī)中的全部文件
github的倉(cāng)庫(kù)中,默認(rèn)的說(shuō)明文檔README.md
推送
- 建立與遠(yuǎn)程的關(guān)聯(lián)枫甲。
首先:注冊(cè)一個(gè)遠(yuǎn)程賬號(hào)(65179334@qq.com ,xiongshaowen,cexoit1983)
然后:建一個(gè)遠(yuǎn)程倉(cāng)庫(kù)git2023(作為此測(cè)試用)
再然后:本地建同名的倉(cāng)庫(kù)git2023源武,再配本地賬號(hào),公鑰想幻,等,再建一些文件粱栖,如a.txt,b.txt
$git init //把該文件夾納入git管理庫(kù)
$vim a.txt //建a.txt文件,輸入一些內(nèi)容
$ git config --global user.name "xiongshaowen"
$ git config --global user.email "65179334@qq.com"
$ ssh-keygen -t rsa -C "65179334@qq.com"
$ssh-keygen //光這個(gè)命令也可生成公鑰用脏毯,
//在c:/user/Administrator/.ssh中產(chǎn)生公鑰文件id_rsa.pub,把內(nèi)復(fù)制到遠(yuǎn)程官網(wǎng)的new sshkey中闹究,
//公鑰一般用于ssh協(xié)議連接,這樣我們就可用它了食店,可免密碼推送拉取渣淤,不過(guò)地址是git開(kāi)頭的。
//生成公鑰也可
$ssh -T git@github.com //測(cè)試可以連通遠(yuǎn)程官網(wǎng)不吉嫩,如果成功會(huì)出現(xiàn)下面的字符串
Hi xiongshaowen! You've successfully authenticated, but GitHub does not provide shell access.
再然后:把文件add .,commit ,再建立關(guān)聯(lián)价认,再后push推送 ,除第一次推送外自娩,后續(xù)更新推送只要git push即可用踩,不用帶后面的參數(shù)。
$git add .
$git commit -m "inita.txt"
$git remote add origin https://github.com/xiongshaowen/git2023.git //origin是遠(yuǎn)程庫(kù)的別名
$git remote add origin git@github.com:xiongshaowen/git2023.git //ssh協(xié)議關(guān)聯(lián)遠(yuǎn)程倉(cāng)庫(kù),前提是把公鑰放進(jìn)遠(yuǎn)程賬戶或庫(kù)中捶箱。
$git push -u origin master
$git push //后續(xù)修改推送智什,不用寫上-u origin master了。
上面push后丁屎,會(huì)彈出一個(gè)網(wǎng)頁(yè)荠锭,讓我們輸入:賬號(hào),密碼(遠(yuǎn)程的)晨川,再又彈出對(duì)話框证九,讓我們輸入賬號(hào),token.
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 一個(gè)token
ssh協(xié)議共虑,不用輸入token,但要生成私鑰id_rsa愧怜,公鑰id_rsa.pub,私鑰留本地,公鑰復(fù)制放到遠(yuǎn)程倉(cāng)庫(kù)或系統(tǒng)中妈拌,這樣可免密鑰推送拉取拥坛。本人把C:/Users/Administrator/.ssh與.gitconfig兩個(gè)文件打包,放進(jìn)網(wǎng)盤里尘分,用的時(shí)候下載解壓以原來(lái)同樣的方式放進(jìn)相同的目錄里猜惋,這樣在網(wǎng)吧咖啡圖書(shū)館,也可直接用培愁,公鑰事先搞到遠(yuǎn)程賬里了著摔。
- 分支推送布局
dev->test(merge dev)-->master(merge test)
dev:開(kāi)發(fā)分支,頻繁改變
test:基本開(kāi)發(fā)完畢后定续,交給測(cè)試實(shí)施人員的分支
master:生產(chǎn)階段——谍咆,很少變化
bugfix:臨時(shí)修復(fù)的分支
origin/master表示遠(yuǎn)程分支,在我們推送拉取時(shí)私股,我們是與它來(lái)感知遠(yuǎn)程信息的摹察,它處于游離狀態(tài),一但修改就要提交
$git remote show #查詢遠(yuǎn)程服務(wù)器
origin //當(dāng)前只有它了
$git remote show origin //顯示遠(yuǎn)程服務(wù)器具體信息
* remote origin
Fetch URL: git@github.com:xiongshaowen/git2023.git
Push URL: git@github.com:xiongshaowen/git2023.git
HEAD branch: master
$git status
Your branch is up to date with 'origin/master'. //origin/master表示遠(yuǎn)程分支庇茫,up to date與港粱。。旦签。一樣最新的
克隆與拉取
????????如果本地沒(méi)有搞倉(cāng)庫(kù)查坪,則可以直接從遠(yuǎn)程克隆來(lái)到本地,不過(guò)克隆過(guò)來(lái)的是以遠(yuǎn)程倉(cāng)庫(kù)名命名的文件夾宁炫,并放在本地偿曙。
本例:以ssh協(xié)議從遠(yuǎn)程倉(cāng)庫(kù)中克隆庫(kù)到本地,事先已配好了公鑰羔巢,私鑰(放本地),第一次克隆過(guò)來(lái)望忆,不用git init罩阵,克隆后,再進(jìn)入克隆過(guò)來(lái)的文件夾中启摄,直接用git等操作稿壁。
//$git clone 遠(yuǎn)程地址 【庫(kù)別名】
$ git clone git@github.com:xiongshaowen/git2023.git
Cloning into 'git2023'...
remote: Enumerating objects: 3, done.
remote: Counting objects: 100% (3/3), done.
remote: Total 3 (delta 0), reused 3 (delta 0), pack-reused 0
Receiving objects: 100% (3/3), done.
$ cd git2023 //進(jìn)入本地版本倉(cāng)庫(kù),已經(jīng)被初始化了
Administrator@JTCH-096 MINGW64 ~/Desktop/githubtest/git2023 (master)
本地與遠(yuǎn)程沖突處理
push/pull:推送歉备,改變指針
-----當(dāng)在云主機(jī)上傅是,提交修改,再push后蕾羊,head指鐘指向origin/master(遠(yuǎn)程庫(kù)感知庫(kù))喧笔,而origin/master處于游離狀態(tài),即可讓所有與遠(yuǎn)程庫(kù)關(guān)聯(lián)的用戶感知龟再,此時(shí)別處用戶沒(méi)有pull的情況下书闸,查詢origin(git remote show origin)即可看到它提醒該用戶要pull的了,你版本過(guò)期了(out of date).
//在網(wǎng)吧的本地庫(kù)查詢origin/master
$git remote show origin
現(xiàn)在我更新網(wǎng)吧的本地庫(kù),git pull不用帶參數(shù)啥的利凑,因?yàn)榭寺r(shí)已經(jīng)自動(dòng)建立遠(yuǎn)程關(guān)聯(lián)了浆劲。
Fast-forward :更新, 如果發(fā)現(xiàn) 更新的內(nèi)容 比自己先一步(commit 的sh1值 在自己之前),則 會(huì)自動(dòng)合并
$git pull
remote: Enumerating objects: 5, done.
remote: Counting objects: 100% (5/5), done.
remote: Total 3 (delta 0), reused 3 (delta 0), pack-reused 0
Unpacking objects: 100% (3/3), 228 bytes | 76.00 KiB/s, done.
From github.com:xiongshaowen/git2023
4a83ff0..dd70d71 master -> origin/master
Updating 4a83ff0..dd70d71
Fast-forward //注意,注意
a.txt | 1 +
1 file changed, 1 insertion(+)
制造沖突場(chǎng)景
現(xiàn)在本人金顿,在云主機(jī)上圆到,有一個(gè)版本庫(kù),本地賬號(hào):tenxinyun,在家或網(wǎng)吧有一個(gè)版本蚯嫌,本地賬號(hào):xiongshaowen,三個(gè)地方的庫(kù)是同名的哲虾,并通過(guò)推送克隆等操作,內(nèi)容都一樣择示。
$git config user.name //查詢本地賬號(hào)名
xiongshaowen
$ls
a.txt //現(xiàn)在庫(kù)中都有a.txt文件
沖突的產(chǎn)生:現(xiàn)在我在騰云主機(jī)上修改a.txt的第一行束凑,再add . commit ,push栅盲。又在網(wǎng)吧主機(jī)上也修改a.txt第一行,再add . commit ,push會(huì)出錯(cuò)汪诉,產(chǎn)生沖突了。
處理沖突:
1.pull
2.fetch+merge
總: pull = fetch + merge
pull沖突處理
我們直接pull了以后谈秫,fetch百分之百分成功扒寄,但還會(huì)有沖突,這是merge出了錯(cuò)誤 拟烫,這時(shí)我們要去vi a.txt把文件修改好该编,再 add .告訴遠(yuǎn)程,再commit硕淑,再push课竣。修改時(shí)可能會(huì)產(chǎn)生.swap文件嘉赎,要?jiǎng)h除之。
還沒(méi)有完于樟,此時(shí)騰云主機(jī)也要pull一下公条,才能讓兩地庫(kù)達(dá)到最新的,即三方都處在一個(gè)commit 鏈點(diǎn)上(sha1值相同)
$ git pull
remote: Enumerating objects: 5, done.
remote: Counting objects: 100% (5/5), done.
remote: Total 3 (delta 0), reused 3 (delta 0), pack-reused 0
Unpacking objects: 100% (3/3), 286 bytes | 95.00 KiB/s, done.
From github.com:xiongshaowen/git2023
dd70d71..8d66d75 master -> origin/master
Auto-merging a.txt
CONFLICT (content): Merge conflict in a.txt //沖實(shí)還有
Automatic merge failed; fix conflicts and then commit the result.
----------------------------------------------------修改:vi a.txt---------------------------------
<<<<<<< HEAD
home網(wǎng)吧沖突產(chǎn)生
=======
home騰云產(chǎn)生沖突
>>>>>>> 8d66d75df2431524360536be19fbcd003becfad7
tenxinyun
---------------------------------------------改好后--------------------------------------------
兩個(gè)人商量好了迂曲,留下騰
home騰云產(chǎn)生沖突
tenxinyun
---------------------------------------------------add . commit push---------------------
$git add .
$git commit -m "網(wǎng)吧處理好了沖突"
$git push
$git remote show origin //再去查看一下遠(yuǎn)程情況靶橱,沒(méi)有沖突(conflict)提示了
----------------------------------------------騰云再pull一次,達(dá)到三方同處一個(gè)commit鏈點(diǎn)上----------------------------------
$git pull
fetch+merge處理
在網(wǎng)吧本地庫(kù)中奢米,先f(wàn)etch抓韩,拉取到本地,百分之百分更新(剛剛騰云主修改了a.txt第二行的內(nèi)容)到origin/master分支上(游離狀的分支)鬓长,然后谒拴,我在網(wǎng)吧本地也修改a.txt第二行,然后也add . commit ,再git merge(合并origin/master,本地master) ,就會(huì)看到?jīng)_突了涉波,這時(shí)英上,就要商量著修改vi a.txt。再提交啤覆,push.最后又到騰云主機(jī)去pull了苍日,達(dá)到三方同一。
$git fetch
$vi a.txt //輸入:
$git add .
$git commit -m "網(wǎng)吧第二次造沖突窗声,fetch+merget處理"
$git merge //合并origin/master,本地master,提示有沖突
Auto-merging a.txt
CONFLICT (content): Merge conflict in a.txt
Automatic merge failed; fix conflicts and then commit the result.
------------------------------------------------解決沖突之vi a.txt----------------------------
兩個(gè)人商量好了相恃,留下騰
home騰云產(chǎn)生沖突第二次制造沖突,用fetch+merge處理
tenxinyun
-----------------------------------------------再次add . commit ,merge----------------------
$git add .
$git commit -m ""網(wǎng)吧第二次沖突處理好了笨觅,vi a.txt"
$git merge //這次可以不用操作拦耐,直接push
Already up to date.
--------------------------------------------------push---------------------------------
$git push
----------------------------------------最后,到騰云主機(jī)pull------------------------------
$git pull //達(dá)到三方同一见剩。
"
模擬遠(yuǎn)程沖突場(chǎng)景都可以在本地制造
1.設(shè)一個(gè)用戶 --local xiongshaowen 65179334@qq.com,操作mygit1庫(kù)杀糯。不用擔(dān)心全局用戶重名,因?yàn)?-local優(yōu)先級(jí)高于system, global.
$git init //先初始化mygit1為版本庫(kù)苍苞,利用了全局用戶名xiongshaowen固翰,先前做的
$git config --local user.name 'xiongshaowen'
$git config --local user.email '65179334@qq.com'
//本地用戶名會(huì)在該本庫(kù)的.git文件中的config中找到
$git remote add origin git@github.com:xiongshaowen/git2023.git
$vi a.txt //如果遠(yuǎn)程倉(cāng)庫(kù)沒(méi)有東西,等下的提交,push會(huì)出錯(cuò)羹呵,所以我們先建一個(gè)文件骂际,再add .commit,push
$git add . //git add *也可將所有文件放進(jìn)暫存區(qū),但它不能全應(yīng)到git語(yǔ)法冈欢,如忽略設(shè)置的東西
$git commit -m "xiongshaowen init"
$git push -u origin master //初次發(fā)布方援,要用到 -u origin master,后續(xù)只要git push即可
2.設(shè)另一個(gè)用戶--local xuhuifeng 1067854873@qq.com本項(xiàng)目用戶操作mygit2庫(kù)
$git init
git config --local user.name 'xuhuifeng'
git config --local user.email '1067854873@qq.com'
$git remote add origin git@github.com:xiongshaowen/git2023.git
$git pull origin master //初次更新遠(yuǎn)程到本地,要用到origin master或其它分支名涛癌,后續(xù)只git pull即可
3.sshkey配置犯戏,只要一個(gè)就可以了送火,因?yàn)樗钦麄€(gè)計(jì)算機(jī)的,但不同的計(jì)算機(jī)就要?jiǎng)e配sshkey了先匪。兩個(gè)用戶都可以用种吸。
git 圖形工具
gitk 、gui 呀非、github desktop
gitk
$gitk
git gui
為了看到效果坚俗,剛建一個(gè)文件(b.txt),沒(méi)有add. commit等岸裙。
另打開(kāi)一個(gè)git bash here窗口猖败,我們修改暫存區(qū)的文件后,再回到gui窗口降允,點(diǎn)‘Rescan'恩闻,可在工作區(qū)看到修改了沒(méi)有提交的文件。
放入暫存區(qū)剧董,點(diǎn)'Stage Changed'
github desktop到desktop.github.com官司網(wǎng)下載
遠(yuǎn)程到本地分支管理
- 創(chuàng)建分支并關(guān)聯(lián)
查看遠(yuǎn)程分支日志和查看地本與遠(yuǎn)程分支情況
image.png
$git log origin/master //或git log refs/remotes/origin/master
$git branch -av //查看本地和關(guān)聯(lián)的遠(yuǎn)程分情況
* master a621745 xuhuifeng init //本地
remotes/origin/master a621745 xuhuifeng init //本地關(guān)聯(lián)的遠(yuǎn)程分支幢尚,也叫追蹤分支
本地到遠(yuǎn)程
一,如果本地有分支dev翅楼,遠(yuǎn)程沒(méi)有dev尉剩,但關(guān)聯(lián)了master分支
$git branch dev //創(chuàng)建本地一個(gè)分支dev
$vi a.txt //輸入:localcontent
$git add .
$git commit -m "localcontent提交“
$git push //這里沒(méi)有切換分支的話,仍推送到遠(yuǎn)程master分支中毅臊,
$git checkout dev //切換到本地的dev分支
$git add .
$git commit -m "dev提交”
$git push //直接推送理茎,這樣會(huì)出錯(cuò),沒(méi)有指定遠(yuǎn)程分支dev管嬉,遠(yuǎn)程沒(méi)有也沒(méi)關(guān)聯(lián)
fatal: The current branch dev has no upstream branch.
To push the current branch and set the remote as upstream, use
git push --set-upstream origin dev
To have this happen automatically for branches without a tracking
upstream, see 'push.autoSetupRemote' in 'git help config'.
$git push -u origin dev //這樣就推送到了遠(yuǎn)程自動(dòng)產(chǎn)生的dev分支中功蜓,并關(guān)聯(lián)了(dev<--->origin/dev)
//git push --set-upstream origin dev //這個(gè)與上條語(yǔ)句功能相同
//git push origin dev:dev2 //可以把本地分支dev推送到遠(yuǎn)程dev2上。
二宠蚂,遠(yuǎn)程有dev分支,本地沒(méi)有dev
1.git pull :遠(yuǎn)程-->追蹤分支童社,還沒(méi)有把dev放到本地來(lái)求厕。
2.追蹤分到本地:并切換到本地的dev中
1.git checkout -b dev origin/dev
2.git checkout -b dev --track origin/dev // -b dev可省略。但兩分支不同名扰楼,就不能省呀癣,一般不這樣做。
3.git pull origin dev:dev2 //不同分支名拉取
4.git fetch origin dev2:refs/remotes/origin/helloworld //將遠(yuǎn)程分支dev2拉取到本地并自動(dòng)創(chuàng)建的本地分helloworld中弦赖。
- 刪除
一项栏,刪除本地分支,當(dāng)然了自已不能刪除自已,再刪除遠(yuǎn)程
格式:git branch -d/-D 本地分支名 刪除本地分支
格式:git push origin src:dset 本地src為空蹬竖,遠(yuǎn)程dset為真實(shí)分支名沼沈,刪除了遠(yuǎn)程分支
git push origin --delete dset
$git branch -d dev2 //git branch -D dev2強(qiáng)制刪除流酬,但遠(yuǎn)程的dev2還在
$git push origin :dev2 //刪除了遠(yuǎn)端dev2,git push origin --delete dev2也可刪除遠(yuǎn)程dev2分支
二,先遠(yuǎn)程刪除了分支列另,本地現(xiàn)在不需要芽腾,也要處理之
1.先查詢我們不需要的追蹤分支(它是感遠(yuǎn)程用的)
$git remote prune origin --dry-run
Pruning origin
URL: git@github.com:xiongshaowen/git2023.git
* [would prune] origin/dev2 //提示dev2可以不用了,遠(yuǎn)程沒(méi)有了页衙。
????????2.清理對(duì)應(yīng)遠(yuǎn)程刪除的分支
$git remote prune
- 版本標(biāo)簽tag
創(chuàng)建推送
-------------每一次提交(不管什么分支)都可打一個(gè)標(biāo)簽摊滔。一般用用標(biāo)識(shí)版本性質(zhì),如發(fā)布版RELEASE,測(cè)試版店乐。艰躺。。
git tag v1.0 //簡(jiǎn)單標(biāo)簽只存儲(chǔ)當(dāng)前commit節(jié)點(diǎn)的sha1值
git tag -a v2.0 -m "我是2.0版" //會(huì)產(chǎn)生新的提交即新的sh1值眨八,肯定包侌當(dāng)前剛剛提交的sha1值腺兴。
-------------推送標(biāo)簽
????????git push origin v1.0 //在那個(gè)分支上推都可看到
????????git push origin v1.0 v2.0 //同時(shí)推送多個(gè)標(biāo)簽
????????git push origin --tags //所有都推送
獲取標(biāo)簽
$git pull //只拉取標(biāo)簽,不要用這個(gè)
$git fetch origin tag
$git fetch origin tag v1.0
刪除遠(yuǎn)程標(biāo)簽
一踪古,官網(wǎng)上直接刪除
二含长,命令行刪除
$git push origin 空格:v1.0
遠(yuǎn)程刪除標(biāo)簽后,本地不能用pull感知伏穆,要手工刪除,pull是前提拘泞,一定要執(zhí)行
$git tag -d v1.0
裸庫(kù),子模塊
- bare
-------沒(méi)有工作區(qū)的倉(cāng)庫(kù)枕扫,只存在服務(wù)端陪腌,是由拉取推送操作,沒(méi)有add 操作。
例:新建一個(gè)文件件夾mygit,
$git init --bare
- submodule
應(yīng)用場(chǎng)景:在一個(gè)倉(cāng)庫(kù)中引用另一個(gè)倉(cāng)庫(kù)的代碼
舉例:
首先:本地建兩個(gè)庫(kù)A,B分別初始化git init,B本地賬號(hào)xuhuifeng,1067854873@qq.com.遠(yuǎn)程也建兩個(gè)公開(kāi)庫(kù)A,B.
image.png
git@github.com:xiongshaowen/A.git
git@github.com:xiongshaowen/B.git
$git init
vi a.txt //aaaa
$git add .
$git commit -m "ainit"
$git remote add origin git@github.com:xiongshaowen/A.git
$git push -u origin master
cd ..
cd B
$git init
$git config --local user.name xuhuifeng
$git config --local user.email 1067854873@qq.com
vi b.txt //bbbb
$git add .
$git commit -m "binit"
$git remote add origin git@github.com:xiongshaowen/B.git
$git push -u origint master
現(xiàn)在搞定本地與遠(yuǎn)程的關(guān)系烟瞧,可以做子模塊了诗鸭,我們是A引用B
-----git submodule add ....
cd A
$git submodule add git@github.com:xiongshaowen/B.git
$git add .
$git commit -m "把B庫(kù)加入了進(jìn)來(lái):"
$git push
----本地A庫(kù)的樣子
----遠(yuǎn)程端的A庫(kù)的樣子
然后:我修改B庫(kù)的內(nèi)容,add . commit push,再分別進(jìn)入A庫(kù)git pull,再進(jìn)入A中的B:git pull,再又返回A:add . commit push.
//進(jìn)入B庫(kù)
$vi b.txt //輸入:modify B reporistory
$git add .
$git commit -m "修改了B庫(kù)"
$git push
//進(jìn)入A庫(kù)参滴,更新B提交的新內(nèi)容
$cd xxxx/A
$git pull
$cd B //當(dāng)前A庫(kù)的B庫(kù)
$git pull
//返回A庫(kù)根目錄
cd ..
$git add .
$git commit -m "把B庫(kù)的更新更新到遠(yuǎn)程A庫(kù)的子庫(kù)B中“”
$git push
最后:這樣我們就得到了一個(gè)遠(yuǎn)程與本地庫(kù)的引用達(dá)到一致了
一下子pull所有子模塊
-----當(dāng)子模塊很多時(shí)强岸,上面的pull方式很煩鎖,可以這樣搞
$git submodule foreach git pull
克隆項(xiàng)目怎么把子模塊也一起克隆呢砾赔?這樣做
$git clone ssh地址 --recursive
刪除子模塊
首先:刪除暫存區(qū),主要內(nèi)容,因?yàn)閷?duì)象區(qū)的內(nèi)容不可刪除蝌箍,修改都是復(fù)制一份到工作區(qū),所以先刪除暫存區(qū)暴心,再告訴對(duì)象區(qū)
然后:刪除工作區(qū)妓盲,有一些配置文件上傳時(shí)不會(huì)上傳的,一直在工作區(qū)专普,如.gitmodules
最后:add . commit ,push
$git rm --cached B
$rm -rf .gitmodules
$git add .
$git commit -m "刪除了子模塊B"
$git push
substree類似submodule但雙向的
- substree
與submodule功能相似悯衬,但它雙向操作,一般建議使用submodule單向的檀夹。
image.png
例:paretn,subtree分別為遠(yuǎn)程和本地建倉(cāng)庫(kù)筋粗,本地直接初始化策橘,不用克隆,再git remote add xxx建立關(guān)聯(lián)亏狰,最后實(shí)現(xiàn)parent修改已引入的subtree項(xiàng)目役纹,再實(shí)現(xiàn)真正的subtree感知更新,反之亦然暇唾,雙向的促脉。
一,建立關(guān)聯(lián)與上面submodule方式一樣策州,parent中有a.txt瘸味,subtree中有b.txt
//------parent中
$git init
$vi a.txt //輸入:aaaa 或echo aaaa > a.txt ,建一個(gè)文件a.txt內(nèi)容為aaaa
$git add .
$git add commit -m "parent init"
$git remote add origin git@github.com:xiongshaowen/parent.git //遠(yuǎn)程庫(kù)別名為origin
$git push -u origin master //第一次提交的樣子,后續(xù)提交只要git push完事了
//------subtree中
$git init
...............
...... git@github.com:xiongshaowen/subtree.git
......... "subtree init"
.......
二够挂,parent通過(guò)subtree命令引入subtree庫(kù)旁仿,引入子模塊,這里我們要關(guān)聯(lián)子模塊了,首先給遠(yuǎn)程子模塊起別名origin-subtree,方便后面的操作
--squash孽糖,會(huì)產(chǎn)生新的提交(很容易fast forward(不同分支追趕沖突)點(diǎn)枯冈,即fast forwar快進(jìn)的前提條件是:兩個(gè)分支提交點(diǎn)的父點(diǎn)是一樣的。所以用--squash一定不要一會(huì)用办悟,一會(huì)兒又不用尘奏,如下次更新時(shí)又不用--squash--------如$git subtree pull -P subtree origin-subtree master --squash。
//-------parent中
$git subtree //查詢一下有多少操作
usage: git subtree add --prefix=<prefix> <commit>
or: git subtree add --prefix=<prefix> <repository> <ref>
or: git subtree merge --prefix=<prefix> <commit>
or: git subtree split --prefix=<prefix> [<commit>]
or: git subtree pull --prefix=<prefix> <repository> <ref>
or: git subtree push --prefix=<prefix> <repository> <refspec>
-h, --help show the help
-q quiet
-d show debug messages
-P, --prefix ... the name of the subdir to split out
//-P或--prefix它是關(guān)鍵的引入?yún)?shù)病蛉。意思引入進(jìn)來(lái)進(jìn)行區(qū)分開(kāi)來(lái)炫加。
//引入子模塊,這里我們要關(guān)聯(lián)子模塊了,首先給遠(yuǎn)程子模塊起別名origin-subtree,方便后面的操作
$git remote add origin-subtree git@github.com:xiongshaowen/subtree.git
$git subtree add -P subtree origin-subtree master
$git subtree add -P subtree2 origin-subtree master --squash //另一個(gè)方式引入子模塊铺然,parent中引入第二個(gè)子庫(kù)俗孝,
//-P后的subtree,subtree2是子庫(kù)名魄健,origin-subtree是遠(yuǎn)程子庫(kù)別名
//master是分支赋铝,即把遠(yuǎn)程,本地子庫(kù)引入到本地和遠(yuǎn)程的父庫(kù)中沽瘦。
//--squash會(huì)減少提交次數(shù)革骨,如子庫(kù)subtree2提交了5次,但在父庫(kù)中只看到一次提交其垄,
//squash只一次提交是偽的,實(shí)際上有兩次卤橄,先提交所有的(合并)绿满,再一次自已提交,往前走了兩步
$git push //發(fā)布到遠(yuǎn)端窟扑,讓遠(yuǎn)端也引入子庫(kù)
三喇颁,本地修改子模塊的b.txt漏健,再提交發(fā)布后,再更新父庫(kù)的子庫(kù)并且再更新遠(yuǎn)端對(duì)應(yīng)的子庫(kù)操作如下:注意--squash參數(shù)的應(yīng)用
//-----parent中
$git subtree pull -P sbutree origin-subtree master
//或
$git subtree pull -P subtree2 origin-subtree master --squash
//因?yàn)橐胱幽K到父庫(kù)子模塊subtree2是用了 --squash參數(shù)
$git push //發(fā)布更新到遠(yuǎn)端
四橘霎,修改父庫(kù)中的子庫(kù)蔫浆,再更新真正的子庫(kù)
如果是在網(wǎng)吧或在其它地方操作,某一天對(duì)同樣的遠(yuǎn)端parent,subtree兩庫(kù)操作姐叁,可以先克隆到本地git clone ssh/https地址瓦盛,再分別進(jìn)入兩個(gè)目錄,不用git init初始化為版本庫(kù),但要再次引入子庫(kù)操作,下面把遠(yuǎn)程子庫(kù)關(guān)聯(lián)進(jìn)父庫(kù)中:先起別名,再關(guān)聯(lián)進(jìn)來(lái)
$git remote add origin-subtree git@github.com:xiongshaowen/subtree.git
$git subtree add -P subtree origin-subtree master
修改父庫(kù)中的子庫(kù)b.txt外潜,add . 提交原环,發(fā)布后,再更新真正子庫(kù)的b.txt,再同步到遠(yuǎn)程处窥。
一嘱吗,修改parent下的subtree的b.txt,再add,commit,push
cd subtree
vi b.txt //輸入parent
$git add .
$git commit -m "parent vi subtree"
$git push origin master //本次不用origin master,可直接push滔驾,
//但它只是更新了自已的谒麦,真正的subtree是不可感知
//要讓其感知,則進(jìn)入parent目錄哆致,再push一次
????????二绕德,真正的子庫(kù)subtree更新parent修改的subtree中的b.txt內(nèi)容.直接pull是不行的.
//但它只是更新了自已的,真正的subtree是不可感知
//要讓其感知沽瞭,則進(jìn)入parent目錄迁匠,再push一次
//------------------parent本地
cd .. //假如當(dāng)前在子庫(kù)中,進(jìn)入subtree的上一級(jí)目錄
$git subtree push -P subtree oirgin-subtree master
//-------------subtree本地
$git pull
這樣就同時(shí)更新真正子庫(kù)遠(yuǎn)端驹溃,本地
五城丧,subtree submodule沖突原理與解決
1.不同的祖先,合并時(shí)互相沖突豌鹤。處理:vi 沖突的文件亡哄。
2.squash沖突,處理:發(fā)布和更新都要用squash參數(shù)布疙。
cherry-pick-->commit轉(zhuǎn)移
????????場(chǎng)景:寫了一半(已提交)蚊惯,發(fā)現(xiàn)寫錯(cuò)分支了,需要將已提交的commit轉(zhuǎn)移分支等灵临,cherry-pick每一次只轉(zhuǎn)移一個(gè)點(diǎn)(本質(zhì)是復(fù)制)截型。要頻頻使用git log命查commit sha1值。
//在需要commit點(diǎn)的分支中儒溉,轉(zhuǎn)移
$git cherry-pick sha1值的4位---6位
把寫錯(cuò)的分支與正確的分支同步
-----先在正確的分支上宦焦,cherry-pick sha1把錯(cuò)的分會(huì)提交點(diǎn)移到正確的分支上,然后,checkout sha,刪除錯(cuò)分支的提交波闹,再以正確的分支創(chuàng)建分支.
例:master為正確的分支酝豪,dev為錯(cuò)的分支.假設(shè)master已有a.txt文件,創(chuàng)建了dev分支精堕,忘了切換回master孵淘,在dev上修改了兩次a.txt,提交了兩次歹篓,現(xiàn)在想做把寫錯(cuò)的分支與正確的分支同步瘫证。
$git branch -b dev
$vi a.txt
$git add .
$git commit -m "first"
$vi a.txt
$git add .
$git commit -m "second"
//上面提交了兩次
$git log
//查看所有提交的sha1值,事先復(fù)制放在一個(gè)文件中
$git checkout master
//切換到正確的分支上滋捶,準(zhǔn)備轉(zhuǎn)移
$git cherry-pick sha1_1
$git cherry-pick sha1_n
//.....有幾個(gè)轉(zhuǎn)移幾個(gè)痛悯,從過(guò)云到現(xiàn)在順序,但是sha1值變了,不是轉(zhuǎn)移前的了重窟,等于多了sha1值
$git checkout dev
//切換到dev刪除提交點(diǎn)载萌,
$git checkout sha1值--最好最初的合點(diǎn)sha1值 //回到寫錯(cuò)之前的點(diǎn)
$git branch -D dev
//刪除分支dev
$git branch -b dev
//創(chuàng)建dev分支,不用切換到master創(chuàng)建巡扇,因?yàn)樽畛鮿?chuàng)建分的點(diǎn)時(shí)扭仁,那個(gè)commit點(diǎn)是游離狀態(tài),游離狀時(shí)厅翔,是創(chuàng)建分支的最好時(shí)機(jī)乖坠。
rebase:變基(衍合)相似cherry-pick
變基---改變分支基礎(chǔ)
????????與cherry-pick操作的方向相反,它是在寫錯(cuò)的分支里面可進(jìn)行刀闷,并且不用一個(gè)一個(gè)的搞熊泵,很方便。
????????rebase會(huì)改變提交的歷史甸昏。變基前的提交點(diǎn)會(huì)被遺棄顽分。
rebase也會(huì)沖突
處理:1.vi xxx ---> add .--->git rebase --continue
????????????2.忽略沖突 git rebase --skip
還原生成rebase之前的場(chǎng)景
?????????git rebase --abort
建議
?????????rebase分支,只在本機(jī)操作施蜜,不要推送到遠(yuǎn)程卒蘸,不要在master上直接rebase.
舉例:
????????先初始化一個(gè)庫(kù)mygit,mygit里有一個(gè)文件a.txt,有一些容。
先在master分支中更改a.txt(第一行翻默,制造后面的沖突)兩次缸沃,提交兩次,再創(chuàng)建dev分支修械,并切換到dev趾牧,也修改a.txt兩次(也是修改第一行,造沖突)肯污,再在dev分支中g(shù)it rebase master把dev所有提交移到master分支上(自動(dòng)與最近一次提交點(diǎn)后接上)翘单。
????????如有沖突梯皿,會(huì)出錯(cuò),我們可以用以上三種方式處理沖突县恕,按照上述做法有兩次沖
????????1.若忽略沖突,可要執(zhí)行兩次git rebase --skip
????????2.vi a.txt剂桥,修改文件沖突 執(zhí)行g(shù)it rebase --continue
????????3.放棄變基git rebase --abort
touch a.txt
vi a.txt //輸入一些內(nèi)容忠烛,此時(shí)還是版本庫(kù)
$git init //納入版本庫(kù),初始化master,不初始化有問(wèn)題
$git add .
$git commit -m "init"
$vi a.txt //改第一行
$git add .
$git commit -m "master1"
......
$git commit -m "master2"
$git checkout -b dev //創(chuàng)建dev分支权逗,并進(jìn)入dev
$vi a.txt
........................"dev1",,,,,"dve2"
$git rebase master //把dev的根基移到master上美尸,
上面的事做完了,為了讓master追上(快進(jìn))dev
$git checkout master //切換分支
$git merge dev //合并