文章目錄
- 1.Git介紹
- 2. 常用命令
- 3. Git分支操作
- 4. Git團隊協作機制
- 5. GitHub操作
- 6. IDEA集成Git
- 7.IDEA操作GitHub
- 8. Gitee
1.Git介紹
Git免費的開源的分布式版本控制系統,可以快速高效從小到大的各種項目
Git易于學習,占地面積小,性能快。它具有廉價的本地庫,方便的暫存區域和多個工作流分支等特性。
什么是版本控制? 版本控制是一種記錄文件內容變化,以便將來查閱特定版本修訂情況的系統。
為什么需要版本控制? 個人開發過渡到團隊協作。
版本控制工具
集中式版本控制工具
CVS,SVN…,都有一個單一的集中管理的服務器,保存所有文件的修訂版本,而協同工作的人們都通過客戶端連到這臺服務器,取出最新的文件或者提交更新。優點:方便管理權限,維護方便 缺點:中央服務器的單點故障。
本庫是集中的存放于中央服務器的。干活的時候,先要去中央服務器里領取最新的版本,然后在開始干活。干完活在將自己的版本上傳到中央服務器。
分布式版本控制工具
Git,Mercurial…,客戶端提取是把代碼倉庫完整地鏡像下來(本地庫)。這樣任何一處協同工作用的文件發生故障,事后都可以用其他客戶端的本地倉庫進行恢復。
服務器斷網的情況下也可以進行開發(因為版本控制是在本地進行的),每個客戶端保存的也都是整個完整的項目(包含歷史記錄,更加安全)
分布式每個人的電腦上都可以直接拷貝完整的代碼版本。而集中式只能拷貝自己需要的。
分布式的服務器掛掉之后,不會影響工作。而集中式的服務器掛掉之后,根本就沒法進行工作。
Git和代碼托管中心(遠程庫):
- 局域網 GitLab
- 互聯網 GitHub,Gitee
流程:工作區(寫代碼) --git add–> 暫存區(臨時存儲) – git commit–> 本地庫(歷史版本) --git push–> 遠程庫(GitHub)
Git安裝:
-
高速下載:
https://npm.taobao.org/mirrors/git-for-windows/
-
next -> 選擇安裝目錄 -> 選項配置(默認) next -> next -> 為git選擇一個默認編輯器,一般選擇Vim(默認)
-> Let Git decide(默認) -> 是否修改環境變量,選第一個Use Git from Git Bash only
-> 選擇后臺客戶端連接協議Use the OpenSSL Library(默認) -> 配置行末換行符Checkout Win…(默認)
-> 選擇Git終端類型Use MinTTY(默認) -> 選擇pull合并的模式Default(默認)
-> 選擇憑據管理器Git Credential…(默認) -> 其他配置(默認都勾選) -> 實驗室功能(不勾選,不成熟) -> install
2. 常用命令
命令 | 作用 |
---|---|
git config --global user.name 用戶名 | 設置用戶簽名 |
git config --global user.email 郵箱 | 設置用戶簽名 |
git init | 初始化本地庫 |
git status | 查看本地庫狀態 |
git add 文件名 | 添加到暫存區 |
git commit -m “日志信息” 文件名 | 提交到本地庫 |
git reflog | 查看歷史記錄 |
git reset --hard 版本號 | 版本穿梭 |
-
首次安裝,要設置一下簽名(區分不同操作者),否則提交代碼報錯,這個和登錄GiHub沒有任何關系。
C:\Users\[user]\.gitconfig
文件里可以看到配置的 -
初始化本地庫
進入
D:\Learning\Git-Space\git-demo
項目文件夾,執行git init
,會生成一個.git隱藏的文件夾 -
查看本地庫狀態,
git status
-
沒有任何東西:On branch master,在master分支中。No commits yet,沒有提交過任何東西。nothing to commit,沒有什么東西需要提交。
-
新增hello.txt文件:多了一行 Untracked files…hello.txt(紅色的),未被追蹤的文件,只是存在于工作區。
-
-
添加到暫存區(Git追蹤文件的過程)
git add hello.txt
有個警告,Git幫我們轉換了末尾換行符再次查看本地庫狀態,Changes to be committed…new file: hello.txt(綠色的),git追蹤到了這個文件,文件只是存在于暫存區(可以刪掉
git rm --cached hello.txt
,只是暫存區刪掉,工作區還是有的) -
提交到本地庫,將暫存區的文件提交到本地庫,形成自己的一個歷史版本
git commit -m "first commit" hello.text
[master (root-commit) 20eda81] first commit ,20eda81就是版本號,后面是描述。
1 file changed, 5 insertions(+),一個文件被改變,5行內容被插入。create mode 100644 hello.txt。再次查看本地庫狀態,No commits yet沒有了,只有On branch master,nothing to commit, working tree clean 沒有東西需要再次提交,工作區是干凈的
-
查看版本信息
git reflog
20eda81 (HEAD -> master) HEAD@{0}: commit (initial): first commitgit log
更詳細點,可以看作者,提交時間等,完整版的版本號。 -
修改文件,在文件第一行加了幾個2
-
再次查看本地庫狀態,Changes not staged for commit…modified:hello.txt(紅色的) ,文件被修改了,而且還沒有被添加到暫存區
-
添加暫存區
git add hello.txt
,再次查看本地庫狀態,Changes to be committed:modified:hello.txt(綠色的) -
提交本地庫
git commit -m "second commit" hello.txt
,[master b205e79] second commit, b205e79第二次提交的版本號。1 file changed, 1 insertion(+),1 deletion(-)。 一個文件被改變,一行內容被插入,一行內容被刪除。(Git是以行為單位維護的,先刪除原先的行再插入新的!!),再次查看本地庫狀態,On branch master,nothing to commit, working tree clean和第一次提交的顯示一樣,又是干凈的了。 -
查看版本信息
git reflog
就會有兩個版本信息了b205e79 (HEAD -> master) HEAD@{0}: commit: second commit,head當前指針指向第二個版本,
cat hello.txt
查看文件是有修改后的。20eda81 HEAD@{1}: commit (initial): first commit。
-
-
歷史版本?
git reflog
git log
-
查看日志
b205e79 (HEAD -> master) HEAD@{0}: commit: second commit 當前指針在第二個版本
20eda81 HEAD@{1}: commit (initial): first commit
-
版本穿越(例如我感覺文件里面添加的2不太好,要回到一號版本去),
git reset --hard 20eda81
HEAD is now at 20eda81 first commit
-
查看日志
20eda81 (HEAD -> master) HEAD@{0}: reset: moving to 20eda81 這里也生成了一個日志
b205e79 HEAD@{1}: commit: second commit
20eda81 (HEAD -> master) HEAD@{2}: commit (initial): first commit 當前指針在第一個版本
-
查看文件
cat hello.ext
文件中第二次在第一行添加的2不見了,回到了第一次的版本,即工作區的文件回到了第一次版本的內容!
底層不是復制保存了很多副本,而是在本地庫中保持了很多日志信息版本信息,調用HEAD指針指向不用的版本
-
3. Git分支操作
分支?:在版本控制過程中,同時推進多個任務,為每個任務,我們就可以創建每個任務的單獨分支。使用分支意味著程序員可以把自己的工作從開發主線上分離開來,開發自己分支的時候,不會影響主線分支的運行。對于初學者而言,分支可以簡單理解為副本,一個分支就是 一個單獨的副本。(分支底層其實也是指針的引用)
好處:
- 同時并行推進多個功能開發,提高開發效率。
- 各個分支在開發過程中,如果某一個分支開發失敗,不會對其他分支有任何影響。失敗的分支刪除重新開始即可。
分支的命令:
命令名稱 | 作用 |
---|---|
git branch 分支名 | 創建分支 |
git branch -v | 查看分支 |
git checkout 分支名 | 切換分支 |
git merge 分支名 | 把指定的分支合并到當前分支上 |
git branch -d 分支名 | 刪除分支 |
-
查看分支
git branch -v
*master(綠色) 20eda81 first commit
-
創建分支,例如
git branch hot-fix
增加熱修分支再次查看分支:hot-fix 20eda81 first commit,*master(綠色) 20eda81 first commit 兩個了!
-
切換分支
git checkout hot-fix
(輸入命令的上一行最后面master變成了hot-fix)再次查看分支:*hot-fix(綠色) 20eda81 first commit,master 20eda81 first commit
在hot-fix分支下修改文件,在第二行加幾個3,修改后一樣要進行
git add hello.txt
,git commit -m "hot-fix first commit" hello.txt
。查看版本信息 :af41acb (HEAD -> hot-fix) HEAD@{0}: commit: hot-fix first commit如果再切換到master分支,則在hot-fix分支修改的內容,在master分支工作區是看不到的。
-
合并分支?
-
正常合并
切換到master分支,執行
git merge hot-fix
把指定的分支合并到當前分支上!!Updating 20eda81…af41acb Fast-forward
hello.txt | 2 ± 1 file changed, 1 insertion(+), 1 deletion(-),一行插入,一行刪除,則修改了一行。
這時master分支的工作區文件能看到在hot-fix分支在第二行添加的3的信息了!!
-
沖突合并
-
沖突的原因:合并分支時,兩個分支在同一個文件的同一個位置有兩套完全不同的修改。Git 無法替我們決定使用哪一個。必須人為決定新代碼內容。
-
模擬沖突:在master分支hello.txt第三行添加4 add commit,在hot-fix分支hello.txt第三行添加5 add commit
-
切回master分支合并:執行
git merge hot-fix
,就會沖突了,看下面的日志:Auto-merging hello.txt CONFLICT (content): Merge conflict in hello.txt (合并沖突在hello.txt文件中)
Automatic merge failed; fix conflicts and then commit the result. (自動合并失敗)
輸入命令的上一行最后面master變成了master|MERGING,查看狀態 both modified: hello.txt (紅色)
-
需要我們手動合并,打開hello.txt文件
hello git sutong hello git sutong 33333 <<<<<<< HEAD (HEAD到等號之間是當前分支的代碼) hello git sutong 44444 ======= (等號到hot-fix之間是要合并的代碼!!) hello git sutong 55555 >>>>>>> hot-fix hello git sutong hello git sutong
手動合并(例如我們想要hot-fix分支里面的,合并完要add,commit提交的時候不能帶文件名!!):
hello git sutong hello git sutong 33333 hello git sutong 55555 hello git sutong hello git sutong
合并只會修改master分支hello.txt文件內容,hot-fix不會變。(最后解決沖突的時候在我們的分支里面解決)
master、hot-fix 其實都是指向具體版本記錄的指針。當前所在的分支,其實是由 HEAD 決定的。所以創建分支的本質就是多創建一個指針。 HEAD 如果指向 master,那么我們現在就在 master 分支上。 HEAD 如果指向hot-fix,那么我們現在就在 hot-fix 分支上。所以切換分支的本質就是移動 HEAD 指針。
HEAD指針指向的是當前分支,分支指針指向的是當前分支在的具體版本。
-
-
4. Git團隊協作機制
如果想要團隊協作機制,則需要遇到代碼托管中心了,即GitHub
-
團隊內協作
-
跨團隊協作
5. GitHub操作
-
創建遠程庫
登錄Github-> 右上角加號點擊New Repository -> 填寫遠程庫名字(一般和本地庫名稱一樣)選擇公有庫/私有庫 填寫描述
-> create repository -> 有兩個連接 https/SSH
-
遠程倉庫操作命令
命令名稱 | 作用 |
---|---|
git remote -v | 查看當前所有遠程地址別名 |
git remote add 別名 遠程地址 | 起別名 |
git push 別名 分支 | 推送本地分支上的內容到遠程倉庫 |
git clone 遠程庫地址 | 將遠程倉庫的內容克隆到本地 |
git pull 遠程庫地址別名 遠程分支名 | 將遠程倉庫對于分支最新內容拉下來后與 當前本地分支直接合并 |
使用命令:
-
起別名,遠程庫鏈接太長了起個別名代替(別名一般和庫名一致)
git remote add git-demo https://github.com/Mrzhugq/git-demo.git
-
查看當前所有遠程地址別名
git remote -v
git-demo https://github.com/Mrzhugq/git-demo.git (fetch)
push,clone,pull都可以用這個別名git-demo https://github.com/Mrzhugq/git-demo.git (push)
-
推送到遠程庫,最小單位的分支 ,
git push git-demo master
(慢)第一次的話會彈出一個窗口,登錄GitHub,選擇右邊的Token,要使用token登錄(怎么創建token百度),根據提示輸入用戶名密碼,最后顯示幾個100%就成功了,可能很慢多試幾次!
-
拉取遠程庫?
如果我們在GitHub上直接修改了文件,比如在hello.txt文件最后一行加了幾個6。
這樣這時遠程庫和本地庫不是同步的了,怎么更新本地庫代碼呢(即如果有他人push,則需要獲取最新版本)
執行命令
git pull git-demo master
也是分支位單位,也是很慢。最后會顯示幾個文件被改變,改變了幾行。在工作區打開hello.txt就能看到在遠程庫修改的了! -
克隆遠程庫到本地庫
新建個目錄,
D:\Learning\Git-Space\git-clone
,執行git clone https://github.com/Mrzhugq/git-demo.git
,克隆不需要登錄賬號。git-clone目錄下就會創建git-demo文件夾,里面會有.git文件,還有hello.txt。小結:clone 會做如下操作。1、拉取代碼。2、初始化本地倉庫。3、創建別名(默認別名的origin)
-
團隊協作?
clone只需要鏈接,pull需要加入團隊(需要創建庫的人進行授權)
團隊內協作,需要授權:進入庫 -> 庫右邊的setting -> collaborators -> add people,輸入用戶名/郵箱都能搜到 -> 復制pending invite即邀請函通過短信發給要授權的人 -> 授權的人登錄他的賬號接受邀請就行了 -> 被授權的人就能看到對應的遠程庫了,就能push了(如果被授權的人push了,我們就需要pull拉取下來,更新我們的本地庫!!)
跨團隊協作:只需要把本團隊遠程庫的對應鏈接發給第三方團隊(或者直接搜),第三方團隊在瀏覽器輸入連接打開遠程庫 -> 點庫右上角的fork -> 第三方的團隊的賬號上就有了對應的遠程庫 -> 就可以對這個遠程庫進行修改了 -> clone -> 修改 -> push -> 點擊庫上面的Pull Requests - new pull request - create pull request -> 可以編寫commit描述,也寫一段話write -> 點右下角創建即可
登錄本團隊的賬號刷新,則在庫的上面Pull Requests會有一個請求 -> 點開查看 -> 還可以給第三方團隊寫一段話write(兩個團隊可以隨時聊天) -> 審核代碼 -> 點下面的Merge pull request 合并申請 -> confirm merge確定合并 -> 在本團隊的遠程庫中就能看到第三方團隊修改的代碼了!(有沖突手動解決)
-
SSH免密登錄
C:\Users\[user]\
下執行ssh-keygen -t rsa -C 2081140153@qq.com
按三次回車,則會生成.ssh文件夾,打開公鑰id_rsa.pub文件復制,登錄GitHub -> settings -> SSH and GPG keys -> new SSH key -> 起個名字,復制到下面就行了add這樣本臺電腦就綁定這個GitHub賬號了,下次使用庫對應的SSH鏈接
git@github.com:Mrzhugq/git-demo.git
,pull,push就不需要登錄了。
6. IDEA集成Git
我的IDEA版本的2020.1
-
設置忽略文件(一次就行),例如IDEA中的.idea文件夾,.iml文件等,這些與項目的實際功能無關,不參與服務器上部署運行。把它們忽略掉能夠屏蔽 IDE 工具之間的差異。
-
創建忽略文件
git.ignore
,建議放到用戶的家目錄下,即C:\Users\[user]\
下(但我的用戶名有的中文,所以我放到安裝目錄下了)
# Compiled class file *.class# Log file *.log# BlueJ files *.ctxt# Mobile Tools for Java (J2ME) .mtj.tmp/# Package Files # *.jar *.war *.nar *.ear *.zip *.tar.gz *.rar# virtual machine crash logs, see http://www.java.com/en/download/help/error_hotspot.xml hs_err_pid*.classpath .project .settings target .idea *.iml
-
在
.gitconfig
文件中引用忽略配置文件(也在家目錄中)[user]name = sutongemail = 2081140153@qq.com [core]excludesfile = D:/Program Files/MyGit/git.ignore
使用正斜線
/
,不要使用\
反斜線
-
-
定位Git程序(一次就行)
setting -> version control -> git -> path to Git… (配置到bin下的git.exe)
-
Git初始化
菜單欄VCS -> inport into Version Control -> Create Git Repository ->默認選擇的就是項目的根目錄,直接點ok(在目錄下就會產生.git文件夾了!) -> 這時文件都變紅了,表示未被追蹤
-
添加暫存區
單個文件右鍵Git -> Add (文件變綠了)
還可以選擇當前項目右鍵Git -> Add 把整個項目中文件都添加暫存區(除了上面所排除的)
-
提交本地庫
當前項目右鍵Git -> Commit Driectory -> 可以看到要提交的文件,下面可以寫commit message -> 提交完文件就變成了原來正常的顏色了
-
切換版本
先修改文件,產生多個版本,則文件變成藍色了,然后add commit,commit的時候可以點看文件看修改前后的對比。
點右下角的Git -> Log 可以看到版本信息 -> 左側的黃色指針代表分支信息,中間的的綠色的指針代表版本信息
想要切換版本只需要在中間,選擇要切換版的版本,右鍵 -> Reset Current Branch to Here… -> 根據需要選擇對應的回退形式
(或者:VCS -> Git -> Reset HEAD… -> Reset Type: 選擇回退形式,To Commit: 填寫要回退到的具體版本號 -> Reset)
-
創建分支
當前項目右鍵Git -> Repository -> Branches… -> New Branch
或者,在IDEA右下角點擊當前分支 -> New Branch
需要切換分支點IDEA右下角的當前分支 -> 選擇要切換的分支 -> Checkout
-
合并分支
-
正常合并
點IDEA右下角的當前分支 -> 選擇要合并的分支 -> Merge into Current
-
沖突合并
合并時沖突,則會彈出一個Conflicts窗口,顯示沖突的文件,選中點右邊的Merger…,進入手動合并的窗口,左側是master分支的代碼,右側是hor-fix的代碼,中間是沒有沖突的代碼!如果想要master的代碼則需要點
》
,然后直接點apply
即可,自動add commit提交到本地庫。
-
7.IDEA操作GitHub
-
設置GitHub賬號(Gitee則需要下載插件)
Settings -> Version Control -> GitHub -> 右上角加號 -> 使用token登錄
-
push到遠程庫(IDEA幫我們在綁定的賬號下創建對應的遠程庫)
VCS -> Import Version Control -> Share Project on Github -> Repository name: 輸入遠程庫的名字(一般和本地庫一樣),Remote:創建別名(也叫本地庫名),Description: 描述信息(可以不填)
會幫我們先創建遠程庫,再把代碼push
-
修改完代碼要重新,add commit push
push:項目右鍵 -> Git -> Repository -> Push… -> 默認使用https鏈接的別名,建議使用SSH鏈接(免密登錄) -> Push
-
拉取遠程庫,pull
push:項目右鍵 -> Git -> Repository -> Pull… :
注意:push 是將本地庫代碼推送到遠程庫,如果本地庫代碼跟遠程庫代碼版本不一致, push 的操作是會被拒絕的。也就是說,要想 push 成功,一定要保證本地庫的版本要比遠程 庫的版本高!因此一個成熟的程序員在動手改本地代碼之前,一定會先檢查下遠程庫跟本地代碼的區別!如果本地的代碼版本已經落后,切記要先 pull 拉取一下遠程庫的代碼,將本地代碼更新到最新以后,然后再修改,提交,推送!
-
克隆遠程庫代碼到本地,clone
打開IDEA -> Get from Versio Control -> 選擇Git,輸入URL(Https/SSH)都行 -> clone (只clone你當時push的分支)
8. Gitee
中文網站,使用方式和GitHub一樣
使用Gitee服務器再國內,可以使用https的鏈接。
Idea默認不帶Gitee插件,需要自己安裝Gitee插件。
-
綁定Gitee
Settings -> Version Control -> Gitee -> 右上角加號 -> 可以使郵箱密碼登錄!
-
add commit 和GitHub一樣
-
push
-
幫我們創建遠程庫
VCS -> Import Version Control -> Share Project on Gitee -> Repository name,Remote,Description
-
push到已有的庫
項目右鍵 -> Git -> Repository -> Push… -> 點默認的別名,Define Remote新建別名,輸入Gitee庫鏈接 -> Push
-
-
pull
項目右鍵 -> Git -> Repository -> Pull… -> Remote 套選擇上面新建的Gitee的別名 -> Pull
-
clone
和GitHub一樣
-
Gitee導入GitHub項目??
右上角加號新建倉庫 -> 右上角導入已有倉庫 -> 輸入再GitHub上庫的Https的鏈接,默認會填充遠程庫名 -> 導入
如果GitHUb中遠程庫發送修改,Gitee也可以強轉刷新進行同步 -> 點擊遠程庫標題右邊的圓圈,強轉同步
同步到Gitee的話進行,再用這個鏈接進clone就比GitHub快多了!!!