一、Git簡介
Git(讀音為/gɪt/。)是一個開源的分布式版本控制系統,可以有效、高速地處理從很小到非常大的項目版本管理。Git 是 Linus Torvalds 為了幫助管理 Linux 內核開發而開發的一個開放源碼的版本控制軟件。
分布式相比於集中式的最大區別在於開發者可以提交到本地,每個開發者通過克隆(git clone),在本地機器上拷貝一個完整的Git倉庫。
圖為git開發過程:
1、Git的功能特性
從一般開發者的角度來看,git有以下功能:
- 從服務器上克隆完整的Git倉庫(包括代碼和版本信息)到單機上。
- 在自己的機器上根據不同的開發目的,創建分支,修改代碼。
- 在單機上自己創建的分支上提交代碼。
- 在單機上合並分支。
- 把服務器上最新版的代碼fetch下來,然后跟自己的主分支合並。
- 生成補丁(patch),把補丁發送給主開發者。
- 看主開發者的反饋,如果主開發者發現兩個一般開發者之間有沖突(他們之間可以合作解決的沖突),就會要求他們先解決沖突,然后再由其中一個人提交。如果主開發者可以自己解決,或者沒有沖突,就通過。
- 一般開發者之間解決沖突的方法,開發者之間可以使用pull 命令解決沖突,解決完沖突之后再向主開發者提交補丁。
從主開發者的角度看,git有以下功能:
- 查看郵件或者通過其它方式查看一般開發者的提交狀態。
- 打上補丁,解決沖突(可以自己解決,也可以要求開發者之間解決以后再重新提交,如果是開源項目,還要決定哪些補丁有用,哪些不用)。
- 向公共服務器提交結果,然后通知所有開發人員。
2、優點
- 適合分布式開發,強調個體。
- 公共服務器壓力和數據量都不會太大。
- 速度快、靈活。
- 任意兩個開發者之間可以很容易的解決沖突。
- 離線工作。
3、缺點
- 資料少(起碼中文資料很少)。
- 學習周期相對而言比較長。
- 不符合常規思維。
- 代碼保密性差,一旦開發者把整個庫克隆下來就可以完全公開所有代碼和版本信息。
二、操作
git客戶端安裝:https://git-scm.com/
1、安裝查看客戶端版本:
C:\Users\xp>git --version
git version 2.14.1.windows.1
2、配置昵稱,用於更新版本跟蹤
2.1、配置昵稱,git bash執行如下命令:
git config --global user.name "xiaoping" git config --global user.email "xiaoping@163.com"
通過 git config -l 這個命令查看已配置的用戶名和郵箱信息
git config -l
2.2、生成密鑰對
打開git bash,輸入命令一路回車
ssh-keygen -t rsa -C "xiaoping@163.com"
3、從遠端克隆工程
git clone git賬戶@xx.xx.xx.xx:倉庫地址。 git clone git@127.0.0.1:data/test.git
4、pull與push操作
4.1.從遠程倉庫dev上更新代碼:git pull <遠程主機> <遠程分支名>:<本地分支名>
E:\workspace\git_test>git pull origin dev:master remote: Counting objects: 17, done. remote: Compressing objects: 100% (6/6), done. remote: Total 9 (delta 3), reused 0 (delta 0) Unpacking objects: 100% (9/9), done. From 123.206.51.64:data/git_test 5218488..e28fd78 dev -> master * [new branch] dev -> origin/dev warning: fetch updated the current branch head. fast-forwarding your working tree from commit 521848830e57c8ae1f45cccb5fd91dd2de077c5b. Already up-to-date.
4.2.本地提交代碼到遠程倉庫dev分支上
查看狀態
E:\git_workspace\demo>git status On branch master Your branch is up-to-date with 'origin/master'. Changes to be committed: (use "git reset HEAD <file>..." to unstage) modified: demo/src/main/java/com/exception/EmsException.java
提交步驟1:
E:\git_workspace\demo>git add .
提交步驟2:
E:\git_workspace\demo>git commit -m "提交說明信息,必須要寫" [master 34ecceb] 提交說明信息,必須要寫 1 file changed, 3 insertions(+), 1 deletion(-)
提交步驟3:git push <遠程主機名> <本地分支名>:<遠程分支名>
E:\test\git_test>git push origin master:dev Counting objects: 9, done. Delta compression using up to 4 threads. Compressing objects: 100% (6/6), done. Writing objects: 100% (9/9), 615 bytes | 307.00 KiB/s, done. Total 9 (delta 3), reused 0 (delta 0) To 123.206.51.64:data/git_test.git 5218488..e28fd78 master -> dev
如果你記不住push與pull 遠程分支名和本地分支名的順序,可以設置git push和pull的默認分支:git branch --set-upstream-to=origin/<遠程分支名> <本地分支名>
D:\workspace\demo>git branch --set-upstream-to=origin/dev master Branch master set up to track remote branch dev from origin.
這樣我就設置了我本地master分支push與pull的默認遠程分支是dev。
5、管理員遠程倉庫的操作
5.1.創建倉庫git init
這部操作完,只要一個.git的隱藏文件,這時是一空的倉庫。使用git branch是看不到任何分支的
5.2.創建一個本地工程push到遠程倉庫上, 這時你會發現報錯了。
remote: error: refusing to update checked out branch: refs/heads/master remote: error: By default, updating the current branch in a non-bare repository remote: error: is denied, because it will make the index and work tree inconsistent remote: error: with what you pushed, and will require 'git reset --hard' to match remote: error: the work tree to HEAD. remote: error: remote: error: You can set 'receive.denyCurrentBranch' configuration variable to remote: error: 'ignore' or 'warn' in the remote repository to allow pushing into remote: error: its current branch; however, this is not recommended unless you remote: error: arranged to update its work tree to match what you pushed in some remote: error: other way. remote: error: remote: error: To squelch this message and still keep the default behaviour, set remote: error: 'receive.denyCurrentBranch' configuration variable to 'refuse'. To 127.0.0.1:data/git_test.git ! [remote rejected] master -> master (branch is currently checked out) error: failed to push some refs to 'git@127.0.0.1:data/git_test.git'
原因:這是由於git默認拒絕了push操作,需要進行設置,修改.git/config文件后面添加如下代碼:
[receive] denyCurrentBranch = ignore
操作完成功提交之后,你在遠程倉庫上輸入 git branch你會看到一個*master。這時master分支就有了
5.3. 創建一個dev分支:
git branch dev(創建dev)/git checkout -b dev(創建並切換到dev)
5.4.遠程倉庫不能讓開發者隨意push,所以刪掉2.中添加到.git/config中的內容
5.5.分支合並到master
[root@t2 demo.git]# pwd /home/git/data/demo.git [root@t2 demo.git]#
查看當前所在分支
[root@t2 demo.git]# git branch * dev master [root@t2 demo.git]#
如果不在切換到master分支
[root@t2 demo.git]# git checkout master Switched to branch 'master' [root@t2 demo.git]# git branch dev * master [root@t2 demo.git]#
將分支合並到master分支
[root@t2 demo.git]# git merge dev Updating 1b85a27..1d471fe Fast-forward demo/.mvn/wrapper/maven-wrapper.jar | Bin 47610 -> 0 bytes demo/.mvn/wrapper/maven-wrapper.properties | 1 - demo/mvnw | 225 --------------------- demo/mvnw.cmd | 143 ------------- .../demo/Controller/TestController.java | 15 ++ 5 files changed, 15 insertions(+), 369 deletions(-) delete mode 100644 demo/.mvn/wrapper/maven-wrapper.jar delete mode 100644 demo/.mvn/wrapper/maven-wrapper.properties delete mode 100644 demo/mvnw delete mode 100644 demo/mvnw.cmd create mode 100644 demo/src/main/java/com/Controller/TestController.java [root@t2 demo.git]#
三、多人協作(pull報錯)
當你從遠程倉庫克隆時,實際上Git自動把本地的master分支和遠程的master分支對應起來了,並且,遠程倉庫的默認名稱是origin。
要查看遠程庫的信息,用git remote:
git remote origin
用git remote -v顯示更詳細的信息:
git remote -v origin git@github.com:xiaoping/test.git (fetch) origin git@github.com:xiaoping/test.git (push)
在往遠程push失敗,報錯:
git push origin dev To github.com:xiaoping/test.git ! [rejected] dev -> dev (non-fast-forward) error: failed to push some refs to 'git@github.com:xiaoping/test.git' hint: Updates were rejected because the tip of your current branch is behind hint: its remote counterpart. Integrate the remote changes (e.g. hint: 'git pull ...') before pushing again. hint: See the 'Note about fast-forwards' in 'git push --help' for details.
Git已經提示我們,先用git pull把最新的提交從origin/dev抓下來,然后,在本地合並,解決沖突,再推送:
git pull There is no tracking information for the current branch. Please specify which branch you want to merge with. See git-pull(1) for details. git pull <remote> <branch> If you wish to set tracking information for this branch you can do so with: git branch --set-upstream-to=origin/<branch> dev
如果pull也失敗了,原因是沒有指定本地dev分支與遠程origin/dev分支的鏈接,根據提示,設置dev和origin/dev的鏈接:
git branch --set-upstream-to=origin/dev dev Branch 'dev' set up to track remote branch 'dev' from 'origin'.
再次pull:
git pull Auto-merging env.txt CONFLICT (add/add): Merge conflict in env.txt Automatic merge failed; fix conflicts and then commit the result
這回pull成功,但是合並有沖突,需要手動解決,解決的方法和分支管理中的解決沖突完全一樣。解決后,提交,再push:
git push origin dev Counting objects: 6, done. Delta compression using up to 4 threads. Compressing objects: 100% (4/4), done. Writing objects: 100% (6/6), 621 bytes | 621.00 KiB/s, done. Total 6 (delta 0), reused 0 (delta 0) To github.com:xiaoping/test.git 7a5e5dd..57c53ab dev -> dev
推薦學習一下:https://www.liaoxuefeng.com/wiki/0013739516305929606dd18361248578c67b8067c8c017b000