對本地庫的操作很少,我們學習1~6節即可,其他了解下。我們可以在idea中完成對本地庫還有遠程庫的操作,可視化界面用起來更加舒適而且也不會混淆。
1. Git概述
-
Git 是一個免費的、開源的分布式版本控制系統,可以快速高效地處理從小型到大型的各種項目。
-
Git 易于學習,占地面積小,性能極快。 它具有廉價的本地庫,方便的暫存區域和多個工作流分支等特性。其性能優于 Subversion、CVS、Perforce 和 ClearCase 等版本控制工具。
-
本地庫已經實現了版本管理,可以切換分支到任意版本下,如果我們是個人開發者,并且不需要與其他人合作開發,那么在本地庫進行版本管理可能已經足夠了。但要注意本地庫無法備份代碼,也不能與其他開發者分享代碼。如果你需要和其他人協同工作或者希望備份你的代碼,那么最好將代碼提交到遠程倉庫中進行版本管理。這樣可以確保對代碼進行備份并方便代碼共享和合作開發。
2. 何為版本控制
版本控制是一種記錄文件內容變化,以便將來查閱特定版本修訂情況的系統。
版本控制其實最重要的是可以記錄文件修改歷史記錄,從而讓用戶能夠查看歷史版本,方便版本切換。我們就像甲方一樣,如果改了七版后還想要回第一版,我們就可以使用Git快速方便地切換回第一版。
雖然我們也可以直接通過備份的方式保存各個版本,但是這種方式不僅占用我們的存儲空間,當文件較大時還會占用我們的時間。而且各個版本備份只是Git的一個作用,在遠程倉庫中還可以通過高亮比較各個版本代碼的不同。跟他人分享我們的代碼、代碼備份、與他人協助開發。
3. Git和代碼托管中心
代碼托管中心是基于網絡服務器的遠程代碼倉庫,一般我們簡單稱為遠程庫。
? 局域網
? GitLab
? 互聯網
? GitHub(外網)
? Gitee 碼云(國內網站)
4. Git安裝
我安裝在D:\ProgramSofts
,安裝好后右鍵任意位置,在右鍵菜單里選擇 Git Bash Here 即可打開 Git Bash 命令行終端。
在 Git Bash 終端里輸入 git --version 查看 git 版本,如圖所示,說明 Git 安裝成功。
5. Git常用命令
命令名稱 | 作用 |
---|---|
git config --global user.name 用戶名 | 設置用戶簽名 |
git config --global user.email 郵箱 | 設置用戶簽名 |
git init | 初始化本地庫 |
git status | 查看本地庫狀態 |
git add 文件名 | 添加到暫存區 |
git commit -m “日志信息” 文件名 | 提交到本地庫 |
git reflog | 查看歷史記錄 |
git reset --hard 版本號 | 版本穿梭 |
6. 設置用戶簽名
任意位置右鍵git Bash然后用以下命令設置用戶前面:
git config --global user.name zane (回車)
git config --global user.email 2116514824@qq.com
在家目錄下我們可以看到新創建了一個文件.gitconfig
雙擊打開查看文件內容或通過git Bash方式獲取文件內容
簽名的作用是區分不同操作者身份。用戶的簽名信息在每一個版本的提交信息中能夠看到,以此確認本次提交是誰做的。Git 首次安裝必須設置一下用戶簽名,否則無法提交代碼。
注意: 這里設置用戶簽名和將來登錄 GitHub(或其他代碼托管中心)的賬號沒有任何關系。
7. 初始化本地庫
在D:\Git-Space
創建一個文件夾git-demo1
,然后在文件夾下右鍵git Bash,輸入以下命令:
基本語法
git init
案例實操
ASUS@LAPTOP-L64DOQDG MINGW64 /d/Git-Space/git-demo1
$ git init
Initialized empty Git repository in D:/Git-Space/git-demo1/.git/ASUS@LAPTOP-L64DOQDG MINGW64 /d/Git-Space/git-demo1 (master)
$ ll -a
total 4
drwxr-xr-x 1 ASUS 197121 0 Jul 5 20:22 ./
drwxr-xr-x 1 ASUS 197121 0 Jul 5 20:22 ../
drwxr-xr-x 1 ASUS 197121 0 Jul 5 20:22 .git/ (.git 初始化的效果,生成 git)
結果查看
初始化后在本地庫(我們剛剛所新建的文件夾)下有一個.git文件夾
8. 查看本地庫狀態
基本語法
git status
案例實操
首次查看(工作區沒有任何文件)
ASUS@LAPTOP-L64DOQDG MINGW64 /d/Git-Space/git-demo1 (master)
$ git status
On branch masterNo commits yetnothing to commit (create/copy files and use "git add" to track)
新增文件(hello.txt)
ASUS@LAPTOP-L64DOQDG MINGW64 /d/Git-Space/git-demo1 (master)
$ vim hello.txt //編輯文件,若沒有則新建一個,輸入后進入編輯區,點擊i進入插入狀態,輸入以下內容:hello git!hello lzk! 按esc退出插入模式后,按下yy表示對光標所在行進行復制,p表示粘貼,編輯完畢,按下:wq表示保存文件
--------------------
hello git!hello lzk!
hello git!hello lzk!
再次查看(檢測到未追蹤的文件)
- 未追蹤文件表示該文件尚未被添加到暫存區
ASUS@LAPTOP-L64DOQDG MINGW64 /d/Git-Space/git-demo1 (master)
$ git status
On branch masterNo commits yetUntracked files:(use "git add <file>..." to include in what will be committed)hello.txtnothing added to commit but untracked files present (use "git add" to track)
9. 添加暫存區
將工作區的文件添加到暫存區
基本語法
git add 文件名
案例實操
- 執行命令后并未提示該文件是否加入到暫存區中,所以我們需要查看一下狀態,可以忽略警告。
ASUS@LAPTOP-L64DOQDG MINGW64 /d/Git-Space/git-demo1 (master)
$ git add hello.txt
warning: LF will be replaced by CRLF in hello.txt.
The file will have its original line endings in your working directory-------------------
ASUS@LAPTOP-L64DOQDG MINGW64 /d/Git-Space/git-demo1 (master)
$ git status
On branch masterNo commits yetChanges to be committed:(use "git rm --cached <file>..." to unstage)new file: hello.txt (檢測到暫存區有新文件)
10. 提交本地庫
將暫存區的文件提交到本地庫
基本語法
git commit -m "日志信息" 文件名
案例實操
ASUS@LAPTOP-L64DOQDG MINGW64 /d/Git-Space/git-demo1 (master)
$ git commit -m "my first commit" hello.txt
warning: LF will be replaced by CRLF in hello.txt.
The file will have its original line endings in your working directory
[master (root-commit) 661f746] my first commit1 file changed, 16 insertions(+)create mode 100644 hello.txt再次查看狀態(沒有文件需要提交)
ASUS@LAPTOP-L64DOQDG MINGW64 /d/Git-Space/git-demo1 (master)
$ git status
On branch master
nothing to commit, working tree clean
11. 修改文件
ASUS@LAPTOP-L64DOQDG MINGW64 /d/Git-Space/git-demo1 (master)
$ vim hello.txt (修改文件,因為我們在本地庫下執行編輯文件命令,一個本地庫為一個文件夾,文件夾下沒有同名同后綴的文件,所以修改hello.txt就是修改指定的那個)-----修改為以下內容--------
hello git! hello lzk!
22222222222222222222
查看狀態
檢測到工作區有文件被修改
ASUS@LAPTOP-L64DOQDG MINGW64 /d/Git-Space/git-demo1 (master)
$ 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.txtno changes added to commit (use "git add" and/or "git commit -a") //此處命令提示我們可以使用git add方式將工作區中的文件添加到暫存區或者使用git commit -a方式提交
--------------------
不add直接commit
兩種情況:
- 新建的文件尚未納入版本控制體系:必須先add納入版本控制體系后才可以commit
- 已納入版本控制體系的文件被修改:可以不add直接commit,Git自動執行了add
將修改的文件再次添加暫存區
ASUS@LAPTOP-L64DOQDG MINGW64 /d/Git-Space/git-demo1 (master)
$ git add hello.txt
warning: LF will be replaced by CRLF in hello.txt.
The file will have its original line endings in your working directory
暫存區文件提交本地庫
ASUS@LAPTOP-L64DOQDG MINGW64 /d/Git-Space/git-demo1 (master)
$ git commit -m "my second commit" hello.txt
.....
12. 查看歷史版本
基本語法
git reflog 查看版本信息
git log 查看版本詳細信息
案例實操
- 新增一次,提交到本地庫,為版本1,修改后提交到本地庫,為版本2。此時指針HEAD總是指向最后一次修改。本地庫只有一份文件,但是git能存在兩個版本信息,很神奇。
ASUS@LAPTOP-L64DOQDG MINGW64 /d/Git-Space/git-demo1 (master)
$ git reflog
5c02310 (HEAD -> master) HEAD@{0}: commit: my second commit
661f746 HEAD@{1}: commit (initial): my first commit
13. 版本穿梭
基本語法
git reset --hard 版本號
案例實操
ASUS@LAPTOP-L64DOQDG MINGW64 /d/Git-Space/git-demo1 (master)
--首先查看當前的歷史記錄,可以看到當前是在 5c02310 這個版本
$ git reflog
5c02310 (HEAD -> master) HEAD@{0}: commit: my second commit
661f746 HEAD@{1}: commit (initial): my first commitASUS@LAPTOP-L64DOQDG MINGW64 /d/Git-Space/git-demo1 (master)
--切換到 661f746 版本,也就是我們第一次提交的版本
$ git reset --hard 661f746
HEAD is now at 661f746 my first commitASUS@LAPTOP-L64DOQDG MINGW64 /d/Git-Space/git-demo1 (master)
--切換完畢之后再查看歷史記錄,當前成功切換到了 661f746 版本
$ git reflog
661f746 (HEAD -> master) HEAD@{0}: reset: moving to 661f746
5c02310 HEAD@{1}: commit: my second commit
661f746 (HEAD -> master) HEAD@{2}: commit (initial): my first commit
14. Git分支操作
什么是分支
在版本控制過程中,同時推進多個任務,為每個任務,我們就可以創建每個任務的單獨分支。使用分支意味著程序員可以把自己的工作從開發主線上分離開來,開發自己分支的時候,不會影響主線分支的運行。對于初學者而言,分支可以簡單理解為副本,一個分支就是一個單獨的副本。(分支底層其實也是指針的引用)
master為開發主線,其余為分支,分支為主線分支進行功能開發,開發好后將功能合并到master上。
分支的好處
-
同時并行推進多個功能開發,提高開發效率。
-
各個分支在開發過程中,如果某一個分支開發失敗,不會對其他分支有任何影響。失敗的分支刪除重新開始即可。
分支的操作命令
命令名稱 | 作用 |
---|---|
git branch 分支名 | 創建分支 |
git branch -v | 查看分支 |
git checkout 分支名 | 切換分支 |
git merge 分支名 | 把指定的分支合并到當前分支上 |
查看分支
基本語法
git branch -v
案例實操
ASUS@LAPTOP-L64DOQDG MINGW64 /d/Git-Space/git-demo1 (master)
$ git branch -v
* master 661f746 my first commit (*代表當前所在的分區)
創建分支
基本語法
git branch 分支名
案例實操
ASUS@LAPTOP-L64DOQDG MINGW64 /d/Git-Space/git-demo1 (master)
$ git branch hot-fix (創建分支hot-fix)ASUS@LAPTOP-L64DOQDG MINGW64 /d/Git-Space/git-demo1 (master)
$ git branch -vhot-fix 661f746 my first commit (剛創建的新的分支,并將主分支 master
的內容復制了一份給它)
* master 661f746 my first commit (當前分支仍為master)
修改分支
--在 maste 分支上做修改
ASUS@LAPTOP-L64DOQDG MINGW64 /d/Git-Space/git-demo1 (master)
$ vim hello.txt
--添加暫存區
ASUS@LAPTOP-L64DOQDG MINGW64 /d/Git-Space/git-demo1 (master)
$ git add hello.txt
--提交本地庫
ASUS@LAPTOP-L64DOQDG MINGW64 /d/Git-Space/git-demo1 (master)
$ git commit -m "my third commit" hello.txt
[master 1eec0ee] my third commit1 file changed, 1 insertion(+), 5 deletions(-)--查看分支
ASUS@LAPTOP-L64DOQDG MINGW64 /d/Git-Space/git-demo1 (master)
$ git branch -vhot-fix 661f746 my first commit (hot-fix 分支并未做任何改變)
* master 1eec0ee my third commit (當前 master 分支已更新為最新一次提交
的版本)
所以修改一個分支上的內容并不會對另一個分支內容產生影響。
--查看分支內容
ASUS@LAPTOP-L64DOQDG MINGW64 /d/Git-Space/git-demo1 (master)
$ cat hello.txt
hello git!hello lzk!
hello git!hello lzk!
hello git!hello lzk!
hello git!hello lzk!
hello git!hello lzk!
hello git!hello lzk!
hello git!hello lzk!
hello git!hello lzk!
hello git!hello lzk!
hello git!hello lzk!
hello git!hello lzk!
lzk first commit master!
切換分支
基本語法
git checkout 分支名
案例實操
ASUS@LAPTOP-L64DOQDG MINGW64 /d/Git-Space/git-demo1 (master)
$ git checkout hot-fix
Switched to branch 'hot-fix'
--發現當先分支已由 master 改為 hot-fix
ASUS@LAPTOP-L64DOQDG MINGW64 /d/Git-Space/git-demo1 (hot-fix)
--修改hot-fix分支為以下的內容
$ vim hello.txt
hello git!hello lzk!
hello git!hello lzk!
hello git!hello lzk!
hello git!hello lzk!
hello git!hello lzk!
hello git!hello lzk!
hello git!hello lzk!
hello git!hello lzk!
hello git!hello lzk!
hello git!hello lzk!
lzk second commit hot-fix!
hello git!hello lzk!--添加暫存區
ASUS@LAPTOP-L64DOQDG MINGW64 /d/Git-Space/git-demo1 (hot-fix)
$ git add hello.txt--提交本地庫
ASUS@LAPTOP-L64DOQDG MINGW64 /d/Git-Space/git-demo1 (hot-fix)
$ git commit -m "hot-fix commit" hello.txt
[hot-fix 5219180] hot-fix commit1 file changed, 1 insertion(+), 5 deletions(-)
合并分支
基本語法
git merge 分支名
案例實操
在master分支上合并hot-fix分支
ASUS@LAPTOP-L64DOQDG MINGW64 /d/Git-Space/git-demo1 (hot-fix)
$ git checkout master
Switched to branch 'master'ASUS@LAPTOP-L64DOQDG MINGW64 /d/Git-Space/git-demo1 (master)
$ git merge hot-fix
Auto-merging hello.txt
CONFLICT (content): Merge conflict in hello.txt (產生沖突)
Automatic merge failed; fix conflicts and then commit the result.
--沖突產生的表現:后面狀態為 MERGING
ASUS@LAPTOP-L64DOQDG MINGW64 /d/Git-Space/git-demo1 (master|MERGING)
沖突產生的原因:
合并分支時,兩個分支在同一個文件的同一個位置有兩套完全不同的修改。Git 無法替我們決定使用哪一個。必須人為決定新代碼內容。
由于master分支上的hello.txt文件(總12行)后兩行與要合并的分支hot-fix的hello.txt文件(總12行)后兩行的內容不同,所以Git不知道誰覆蓋誰,所以合并失敗!
查看狀態
檢測到文件有兩處修改
ASUS@LAPTOP-L64DOQDG MINGW64 /d/Git-Space/git-demo1 (master|MERGING)
$ git status
On branch master
You have unmerged paths.(fix conflicts and run "git commit")(use "git merge --abort" to abort the merge)Unmerged paths:(use "git add <file>..." to mark resolution)both modified: hello.txtno changes added to commit (use "git add" and/or "git commit -a")
解決沖突
編輯有沖突的文件,刪除特殊符號,決定要使用的內容
提示:特殊符號:<<<<<<< HEAD 當前分支的代碼 ======= 合并過來的代碼 >>>>>>> hot-fix
ASUS@LAPTOP-L64DOQDG MINGW64 /d/Git-Space/git-demo1 (master|MERGING)
$ cat hello.txt
hello git!hello lzk!
hello git!hello lzk!
hello git!hello lzk!
hello git!hello lzk!
hello git!hello lzk!
hello git!hello lzk!
hello git!hello lzk!
hello git!hello lzk!
hello git!hello lzk!
hello git!hello lzk!
<<<<<<< HEAD
hello git!hello lzk!
lzk first commit master!
=======
lzk second commit hot-fix!
hello git!hello lzk!
>>>>>>> hot-fixASUS@LAPTOP-L64DOQDG MINGW64 /d/Git-Space/git-demo1 (master|MERGING)
$ vim hello.txt
按上面的提示進行修改操作--修改完再次查看
ASUS@LAPTOP-L64DOQDG MINGW64 /d/Git-Space/git-demo1 (master|MERGING)
$ cat hello.txt
hello git!hello lzk!
hello git!hello lzk!
hello git!hello lzk!
hello git!hello lzk!
hello git!hello lzk!
hello git!hello lzk!
hello git!hello lzk!
hello git!hello lzk!
hello git!hello lzk!
hello git!hello lzk!
lzk first commit master!
lzk second commit hot-fix!--添加到暫存區
ASUS@LAPTOP-L64DOQDG MINGW64 /d/Git-Space/git-demo1 (master|MERGING)
$ git add hello.txt--執行提交
ASUS@LAPTOP-L64DOQDG MINGW64 /d/Git-Space/git-demo1 (master|MERGING)
$ git commit -m "merge hot-fix"
[master 651389c] merge hot-fix--發現后面 MERGING 消失,變為正常
ASUS@LAPTOP-L64DOQDG MINGW64 /d/Git-Space/git-demo1 (master)
實際應用:將項目A同時安排給B,C去完成,每人負責不同的模塊,項目A此時就是主線分支master,而B,C需要在其他分支上進行工作,完成各自模塊后自身分支合并到主線分支上去。