git學習

1. 安裝git
centos上   
yum install -y epel-release
yum install -y git

2. 創建版本庫
mkdir  /home/gitroot
cd /home/gitroot
git init   //用這個命令初始化,讓這個目錄變成git可以管理的倉庫

3. 提交文件到倉庫
創建一個文件 1.txt
echo -e "123\naaa\n456\nbbb" > 1.txt

git add 1.txt  //把1.txt添加到倉庫中
git commit -m "add new file 1.txt"   //add完了必須要commit纔算真正把文件提交到git倉庫裏
初始使用該命令會提示:
*** Please tell me who you are.

Run

git config --global user.email "[email protected]"
git config --global user.name "Your Name"

to set your account's default identity.
Omit --global to set the identity only in this repository.


這是要讓我們設置用戶郵箱和用戶名。根據它提示設置一下即可:
git config --global user.email "[email protected]"

git config --global user.name "aming"


echo -e "111111\n2222222222" >> 1.txt  //先更改一下1.txt
git status   //查看當前倉庫中的狀態,比如是否有改動的文件
git diff 1.txt  //可以對比1.txt本次修改了什麼內容,相比較倉庫裏面的版本

4. 版本回退
多更改幾次1.txt,並進行 git add,  git commit操作
git log  //可以查看所有提交git倉庫的記錄操作
git log --pretty=oneline  //一行顯示,更清楚

通過git log我們可以查看到過去提交的所有版本,所以根據這個log,我們可以指定回退某個版本
比如,結果如下
git log --pretty=oneline
142dde7c32cf8c2e4b59b6fafae468dedbb72ff9 change 1.txt
0ff5ab178ea2207e71fbe935c57a8ef1c30f63d7 change 1.txt
5aacaf4341484186802faed7d2db87840b2adc66 new file 2.txt
73235a8549b7e9cfa171d632e1a8f0d91cd0a0d5 new file


git reset --hard 0ff5ab1  //可以回退到第二行的這個版本,這裏後面跟的字符串可以簡寫。
當回退到該版本後,再  git log 則最上面的版本不再顯示了,那如果想再倒回退到第一行那個版本怎麼辦?
git reflog  //可以顯示所有的版本

5. 撤銷修改
修改1.txt,發現改的不對(還沒有git add),想恢復到上一次提交時的狀態。或者1.txt不小心給刪除掉了。可以使用
git checkout -- 1.txt  //恢復到上一次提交時的狀態

如果1.txt修改完了,保存後,git add 1.txt了,但沒有commit,再想回退到上一次提交時的狀態。可以使用
git  reset HEAD 1.txt
然後再
git checkout -- 1.txt

那如果不僅add也commit了,那就用第4版本回退的方法。

6. 刪除
touch  2.txt
echo "22222222222222" > 2.txt
git add 2.txt
git commit -m "add new file 2.txt"

上面的操作,我們在git倉庫裏提交了一個新的文件2.txt,下面刪除它
rm -f 2.txt
git status //可以看到,提示2.txt文件被刪除了
如果要想恢復,直接用  git  checkout -- 2.txt
現在是,我們想在git倉庫裏刪除
git rm 2.txt
git commit -m "delete 2.txt"
這樣就徹底刪除了2.txt

7. 做一個遠程倉庫(github)
首先到 https://github.com 註冊一個賬號,創建自己的git,點repositories  --> new
名字自定義,比如叫studygit  選擇public  點 create repository

添加key:
右上角點自己頭像,選擇settings,左側選擇SSH and GPG keys
右上角點New SSH key,把linux機器上的 /root/.ssh/id_rsa.pub內容粘貼到這裏

把本地參考推送到遠程倉庫

cd /home/root; mkdir studygit; cd studygit;git init; //先要創建本地倉庫,才能和遠程倉庫聯繫起來
git remote add origin [email protected]:aminglinux/studygit.git
git push -u origin master
下一次再推送,就可以直接 git push


下面我們克隆一個遠程倉庫過來
cd /home
git clone  [email protected]:aminglinux/lanmp.git
它提示,會在當前目錄下初始化一個倉庫,並創建一個.git的目錄
Initialized empty Git repository in /home/lanmp/.git/

完成後,ls可以看到一個lanmp的目錄
cd  lanmp
vi lanmp.sh 編輯一下文件,然後提交
git add lanmp.sh
git commit -m "sdlfasdf"
然後再推送到遠程服務端
git push

8. 分支管理
查看分支
git branch

創建分支
git branch aming
git checkout  aming

在aming分支下 ,編輯2.txt,並提交到新分支
echo "askdfjlksadjflk" >  2.txt
git add 2.txt
git commit -m "laksjdflksjdklfj"

切換回master分支
git checkout master

合併分支
git merge aming   //把aming分支合併到了master,merge後面的分支名字必須得是內容最新
如果master分支和aming分支都對2.txt進行了編輯,當合並時會提示衝突,需要先解決衝突纔可以繼續合併。

解決衝突的方法是在master分支下,編輯2.txt,改爲aming分支裏面2.txt的內容。 然後提交2.txt,再合併aming分支。
但是這樣有一個問題,萬一master分支更改的內容是我們想要的呢? 我們可以編輯2.txt內容,改爲我們想要的,然後提交。切換到aming分支,然後合併master分支到aming分支即可。(倒着合併)合併分支有一個原則,那就是要把最新的分支合併到舊的分支。也就是說merge後面跟的分支名字一定是最新的分支。

刪除分支
git  branch -d aming
如果分支沒有合併,刪除之前會提示,那我們就不想合併,強制刪除
git branch -D aming

對於分支的應用,建議大家以這樣的原則來:
master分支是非常重要的,線上發佈代碼用這個分支,平時我們開發代碼不要在這個分支上。
創建一個dev分支,專門用作開發,只有當發佈到線上之前,纔會把dev分支合併到master
開發人員應該在dev的基礎上再分支成個人分支,個人分支(在自己pc上)裏面開發代碼,然後合併到dev分支

git分支.png




在dev分支合併bob分支的命令是:
git checkout dev   //先切換到dev分支,然後
git merge bob

9. git stash 保留現場
當你正在進行項目中某一部分的工作,裏面的東西處於一個比較雜亂的狀態,而你想轉到其他分支上進行一些工作。問題是,你不想提交進行了一半的工作,否則以後你無法回到這個工作點。解決這個問題的辦法就是git stash命令。


比如我們在aming分支,編輯了一個新的文件3.txt
這時候我們需要到其他分支去修復一個bug,所以需要先git add 3.txt
然後 git  stash  保存一下現場
再切換到另外分支去修復bug,修復完bug後,再回到aming分支
git stash list 可以看到我們保存過的現場
用 git stash apply 恢復現場
也可以指定stash:
git stash apply stash@{1}


10. 遠程分支
查看遠程庫信息,使用git remote -v  本地新建的分支如果不推送到遠程,對其他人就是不可見的
查看遠程分支  git ls-remote origin
從本地推送分支,使用git push origin branch-name,如果推送失敗,先用git pull抓取遠程的新提交
在本地創建和遠程分支對應的分支,使用git checkout -b branch-name origin/branch-name,本地和遠程分支的名稱最好一致
從遠程抓取分支,使用git pull,如果有衝突,要先處理衝突。



11. 標籤管理
標籤類似於快照功能,我們可以給版本庫打一個標籤,記錄某個時刻庫的狀態。我們可以隨時恢復到該狀態。
git checkout master 先切到master分支上
git tag v1.0  給master打一個標籤v1.0

git tag 可以查看所有的標籤
git show v1.0 查看標籤具體信息

tag是針對commit來打標籤的,所以可以針對歷史的commit來打tag
git log --pretty=oneline --abbrev-commit //簡單顯示commit信息
git tag v0.9 46d3c1a
git tag -a v0.8 -m "tag just v1.1 and so on"  5aacaf4  //可以對標籤進行描述

git tag -d v0.8  //刪除標籤


git push origin v1.0   //推送指定標籤到遠程
git push --tag origin   //推送所有標籤

如果本地刪除了一個標籤,遠程也想要刪除需要這樣操作:

git tag v1.0 -d
git push origin :refs/tags/v1.0


12. 巧用別名
git commit 這個命令是不是有點長? 用別名可以提高我們的工作xiaol
git config --global alias.ci commit
git config --global alias.co  checkout
git config --global alias.br  branch

查看git別名使用命令
git config --list |grep alias


查詢log小技巧:
git config --global alias.lg "log --color --graph --pretty=format:'%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr) %C(bold blue)<%an>%Creset' --abbrev-commit"

取消別名
git config --global --unset alias.br


13. 搭建git服務器
github畢竟是公開的,而私有倉庫又得花錢買。所以我們可以想辦法搭建一個私有的,只自己公司使用的。
yum install git //安裝git
useradd -s /usr/bin/git-shell git   //添加git用戶,並且設置shell爲/usr/bin/git-shell,目的是爲了不讓git用戶遠程登陸
cd /home/git
mkdir .ssh
touch .ssh/authorized_keys

chown -R git.git .ssh
chmod 600 .ssh/authorized_keys

定好存儲git倉庫的目錄,比如 /data/gitroot
mkdir /data/gitroot
cd /data/gitroot
git init --bare sample.git // 會創建一個裸倉庫,裸倉庫沒有工作區,因爲服務器上的Git倉庫純粹是爲了共享,所以不讓用戶直接登錄到服務器上去改工作區,並且服務器上的Git倉庫通常都以.git結尾
chown -R git.git sample.git


在客戶端上(自己pc)克隆遠程倉庫
以上操作是在git服務器上做的,平時git服務器是不需要開發人員登錄修改代碼的,它僅僅是充當着一個服務器的角色,就像github一樣,平時操作都是在我們自己的pc上做的。
首先要把客戶端上的公鑰放到git服務器上/home/git/.ssh/authorized_keys文件裏
git clone git@ip:/data/gitroot/sample.git

此時就可以在當前目錄下生成一個sample的目錄,這個就是我們克隆的遠程倉庫了。進入到這裏面,可以開發一些代碼,然後push到遠程。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章