一、Git概述和環境搭建
Git是一個開源的分佈式版本控制系統,區別於集中式的系統,Git系統中每一個終端都有一套完整的版本庫,脫離了網絡,也能管理版本,能提高效率。可以有效、高速地處理從很小到非常大的項目版本管理。
在團隊開發中代碼同步是非常重要的,大致開發的流程如下:
1.在服務器上創建git倉庫
2.開發者A和B從服務器上克隆倉庫
3. A和B在本地創建分支,負責開發自己的模塊
4. A同步最新代碼到本地,推送代碼到服務器倉庫
5. B同步最新代碼到本地,推送代碼到服務器倉庫
6.如果A和B在更新同步代碼的時候有衝突,則解決衝突。若無衝突,則代碼自動合併
基本概念:
工作區: 在電腦裏能看到的目錄。
暫存區: 一般存放在".git目錄下”下的index文件 (.git/index)中,所以也叫索引
版本庫: 工作區有一個隱藏目錄.git,這個不算工作區,而是Git的版本庫
使用git add添加一個文件的時候,會先加入到暫存區;
通過git commit之後,暫存區的內容同步到正式的版本庫。
1、下載安裝git客戶端
下載地址:https://git-scm.com/download/
官網下載太慢,轉到下載地址2
下載地址2:https://npm.taobao.org/mirrors/git-for-windows/
安裝選擇2,默認的可以使用cmd,會自動配置環境變量
選擇包含cmd命令的安裝方式,在cmd輸入git命令有命令提示表示成功。
安裝完成的目錄結構
2、準備遠程倉庫賬號
在我們團隊開發,或者把代碼共享給其他人的時候,需要有一個遠程倉庫,常用的遠程git服務有:
GitHub( https://github.com/):公有庫免費,私有付費。
碼雲( https://gitee.com):國內的服務商,公有、私有都免費。
GitLab( https://gitlab.com):與前兩者不同,GitLab是可以部署到自己服務器上的web服務。
在開始學習git之前,需要註冊一個賬號,碼雲或者GitHub的都可以(兩個平臺是獨立的,二者不能通用)。
註冊成功之後,打開git安裝路徑下的git-nash.exe
輸入用下面的命令,做一個全局配置,後序提交代碼的時候都會攜帶這個信息,最好用前面註冊git的郵箱
git config --global user.name "暱稱"
git config --global user.email "郵箱"
之後在電腦用戶目錄下會出現一個.gitconfig文件,全局配置就設置好了
使用命令:git config --list
可以查看配置信息
–global
參數代表的是全局配置,對當前用戶的所有倉庫有效,常用
–local
只對某個倉庫有效,不寫的話默認就是local
–system
對系統所有登錄的用戶有效,很少用
二、基礎命令
創建一個空文件夾用來當本地倉庫
在git-bash中切換目錄
git中支持linux中的命令,比如
cd
: 打開目錄
vim
:編輯文本 :wq
保存並退出
pwd
:是顯示當前目錄
ls
:顯示文件夾中的內容
cat
:查看文件內容
1、git init
初始化版本庫
執行 git init
之後在目錄裏會看到一個 .git 文件夾
2、git add
將文件添加到暫存區
格式:git add 文件名
示例:在目錄下手動創建一個文件(隨便什麼文件都行,就是我們平時用的文件):
git add -u
可以將當前託管的文件一起提交,不需要指定文件名,此時的文件進入了git的 暫存區
3、git status
查看當前暫存區的狀態
格式:git status
4、git commit
通過 git commit 命令正式提交到版本庫(只提交暫存區中的數據),其中 -m 參數表示的是提交時的註釋信息,我們要寫好當前版本都修改了什麼,方便以後版本回退的時候,退到指定的版本。
格式:git commit -m "備註"
文件提交後,再看暫存區就沒有文件了。
commit只提交暫存區中的數據,所以需要先add,如果是文件已經add過了,可以使用-am參數直接提交
格式:git commit -am "備註"
如果想修改最近一次的提交信息message
格式: git commit --amend
進入編輯頁面後按i進行編輯,再按esc鍵退出編輯,:wq
再回車退出
5、git diff
查看文件變動
格式:git diff --cached
查看暫存區和版本庫的變動
格式:git diff
查看工作區和暫存區的變動
git diff -- 文件名
:是隻查看某一個文件的區別
git diff 分支1 分支2 -- 文件名
查看兩個分支之間的區別,分支可以寫成commit號
6、git reset
用於回滾(撤銷)暫存區中的操作
格式:git reset
7、git mv
文件重命名
格式: git mv 原文件 目標文件
8、git log
查看日誌
格式:git log
參數:
--oneline
簡潔的查看歷史
-n數字
最近幾次的記錄
--all
查看所有分支所有記錄
--graph
圖形化方式
9、git checkout
可以從主幹或其它分支快速創建一個新分支或切換分支,使用 git checkout 命令,在checkout的時候我們可以指定一個版本號,這個版本號就是在 git log 中查到的hash值。版本號在使用的時候可以只使
用前幾位,只要當前的幾位能夠確定唯一標識就可以。
git checkout -b 新分支 原分支
創建分支
git checkout 分支
切換分支
10、git branch
用於操作git分支
分支是git中非常重要的一個概念,在開發時我們可以創建多個分支,每個分支間是相互獨立的,互不影響。當分支開發完畢後,可以選擇合併到主幹。
格式:git branch -v
看本地有多少分支
格式:git branch -d 分支名
刪除分支
11、分離頭指針
創建臨時分支,可選擇保留或丟棄
格式:git checkout hash
修改保存文件提交後切換分支
git log查不到與此記錄相關的信息
保存修改的分支
12、gitk
打開圖形界面
格式:gitk
可以看到各個版本的信息,包括父子關係、提交時間。tree可以顯示目錄結構。在View中可以定義顯示的視圖
13、git rebase
指定修改歷史版本中的提交信息
格式:git rebase -i hash值
(hash選的是父親)
只修改提交信息選擇 r 命令,修改後保存
14、git rm
刪除一個文件
格式:git rm 文件名
刪除工作區中的文件,並把變動放在暫存區
格式:git rm 文件名 --cached
刪除暫存區中的文件,不刪除工作區
15、git stash
保存暫存區的文件
如果我的文件,有一部分新功能A在暫存區,但臨時增加了別的任務B,需要在之前的版本上修改,而我的新功能A還沒開發完,這時我們可以使用 git stash 命令來保存暫存區,此時文件會恢復到暫存區之前的樣子。
格式:git stash
git stash apply
和 git stash pop
命令都能將stash緩存的東西恢復,區別是apply會將緩存的信息保留在 git stash list
中,而pop則直接移出list。
三、git內部構成
進入到工作區.git目錄
1、HEAD
HEAD文件中存放的是當前目錄工作的分支
當切換分支後,HEAD的內容會發生改變
查看HEAD和父之間的差異,用 git diff HEAD HEAD^
^
代表parent, ^^
就是父親的父親,等同於 ~2
2、refs
refs是引用,裏面包含了分支和標籤等一些信息
繼續查看master文件,可以看見文件中保存的內容是和hash版本號相關的:
3、config
config中記錄的是當前目錄的配置,通過 git config --local 設置的就是這個文件
4、objects
可以隨便打開一個目錄,查看文件類型和文件內容(不同的人測試結果可能不同,多切換幾個文件夾就能找到文件了):
git中核心的對象主要有 commit , tree 和 blob 三種類型。git中認爲兩個文件中如果內容相同,就是唯一的一個blob(和內容相關,和文件名無關,節約存儲空間)。
在工作區中添加一個test-dir文件夾,並創建兩個文件,提交到git中
在gitk中查看,可以看見目錄結構
在git中每一個commit對應一個tree,它就是工作區那個文件夾工作區tree下面會有其它的tree和blob,如下圖(爲方便理解,寫了文件名,實際上只跟地址相關,和文件名無關)
四、版本回退
1、暫存區恢復和HEAD一樣
格式:git reset HEAD -- 文件名
撤銷暫存區中的變動,其中文件名是可選參數,不寫就是撤銷所有,(它不會撤銷你文件中的修改,即不改變工作區,撤銷的是add)
2、工作區恢復成暫存區
格式:git checkout --文件名
修改本地文件,然後想恢復到暫存區中的版本
3、回退到歷史的commit(慎用)
格式:git reset --hard 版本
可以直接回退到歷史版本的節點,並且回退的這個版本,之後的提交都會被永久刪除了
五.、忽略文件
當工作區下有一些文件不需要git管理的時候,在工作區下添加一個 .gitignore 文件,必須叫這個名字。文件中的語法如下:
匹配文件夾,用 dir_name / 比如忽略docs文件夾,就寫 docs/匹配文件名,用 fileName,比如忽略f.txt,就寫 f.txt支持通配符,比如所有的jar包都忽略,就寫 *.jar需要注意的是,已經添加到版本庫的文件,後加入到.gitignore,此時是無效的。必須刪除版本庫中該文件的信息纔可以。
六. 同步到遠程庫
1、公私鑰配置
打開cmd窗口,執行如下命令(郵箱換成自己註冊的郵箱),其它不用填,連續三次回車,之後在系統的用戶目錄下會有一個.ssh的文件夾:
ssh-keygen -t rsa -C "[email protected]"
把id_rsa.pub中的內容複製到GitHub或者碼雲裏:
github:
碼雲:
2、創建遠程倉庫
3、push同步到遠程庫
git remote add 名字 地址
是連接遠程庫的命令
git push -u 名字 分支
是推送本地代碼到遠程倉庫
git remote add origin https://github.com/booy123/study.git
git push -u origin master
如果報錯
fatal: remote origin already exists.
先刪除遠程 Git 倉庫
git remote rm origin
查看倉庫
git remote -v
可以查看遠程信息:
4、刪除本地庫和遠程庫的關聯
代碼:git remote remove 名字
七、解決衝突
1、遠程和本地衝突
fetch命令會把遠端庫同步到本地,但是不會和本地分支關聯。
如果遠程庫不是空的,或者遠程庫中有本地沒有的東西,比如在創建工程的時候選了README
遠程倉庫增加一個文件
此時同步 git push -u origin master
會出現問題,本地不能向遠端提交數據:
方式一、通過git fetch origin master
同步下來,會產生新分支
git fetch origin master
:從遠程的origin倉庫的master分支下載代碼到本地的origin master
接着用git merge origin/master
命令,把分支合併進來,merge的時候要注意解決衝突
還有一個命令是 git pull ,相當於fetch+merge的命令。pull和fetch的區別是,fetch不會直接進行分支合併,需要merge。而pull直接合並,可能會產生衝突,需要手動解決
方式2:執行以下語句
git pull origin master --allow-unrelated-histories
再推送就解決了
2、多人開發解決衝突
1)、修改不同文件
當團隊中的人修改不同文件時,只要其中一個人提交到遠程,另一個人肯定是提交失敗的:
git push origin
提交時會出現如下衝突:
執行git fetch origin master
命令,再git merge origin/master
:wq
保存
git push origin
再提交就可以了
2)、修改相同文件
修改相同文件,有兩種情況,一種是修改的區域相隔較遠,一種是修改的區域相同或鄰近,比如下面的情況就是鄰近的情況
遠程修改文件demo
本地修改後同步到遠程庫,無法提交
執行git fetch origin master
命令,再git merge origin/master
提示了衝突文件,需要手動編輯再提交就可以了
如果修改的區域相隔較遠,一般merge的時候就會直接合並,不會出現衝突。
merge之後,確認衝突已解決,就可以繼續提交了。
3)、修改文件名衝突
遠程修改文件名
本地修改文件名並提交同步到遠程庫出現錯誤
衝突的一方去git pull 時提示文件重命名,並得到對方的文件
需要做的是rm不需要的文件,add需要的文件,最後commit
八、合併分支
把temp分支合併進master,先切換到master上,再執行git merge temp
九、其他操作
1、刪除已上傳的無關信息
刪除遠程倉庫.idea 文件夾
git rm -r --cached .idea #--cached不會把本地的.idea刪除
git commit -m 'delete .idea dir'
git push -u origin master
十、IDEA使用git
1、配置Git客戶端
打開idea的settings,配置好的git地址
2、上傳項目
初始化倉庫
右鍵項目添加到暫存區
提交到版本庫
同步到遠程倉庫
填寫遠程倉庫用戶名密碼
提交成功
3、下載項目
4、解決衝突
如果兩個人改了同一段代碼,一個人先提交,另一個人就無法提交
選擇Merge比較衝突
解決衝突
點擊這兩個箭頭可以選擇合併代碼的位置,調整代碼之後,再重新Push代碼即可。
5、創建分支
創建新分支之後,提交代碼,不會影響原分支
6、切換分支
切換分支之後,代碼會變成該分支的代碼
7、合併分支
把m1合併到master
先切換到master,保證當前分支是master,在需要合併的m1分支上點擊merge,merge成功之後是在本地合併了,需要再push到遠程倉庫。在提交過程中如果遇到衝突需要解決衝突之後再Push
8、版本回退
在回退的文件進行修改,push解決衝突