前言
本系列文章,將在各路大神文章的基礎(chǔ)上,總結(jié)提煉出自己的感悟,力求將大神的觀點總結(jié)的更加凝練,希望站在巨人的肩膀上,能看得更遠
請務(wù)必先在無實際作用的測試工程中練習(xí)Git命令
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ——《魯迅沒說過的話精選集》
在還沒有很熟悉Git命令之前,請務(wù)必先確認輸入的指令是否是你想要的效果,如果不能確定,還是先使用可視化工具
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ——《跑路程序員告誡你的二三事》
本篇引用文章
廖雪峰大神的專題文章--史上最淺顯易懂的Git教程!
另外,參考了這里:
易百教程--Git教程
內(nèi)容提要
作為一名程序員,Git/SVN是我們每天都要打交道的東西(本篇不討論SVN),然而,我們真的會用Git嗎?你是不是也和我一樣,只會git clone git pull git commit git push呢?如果你也是,請跟隨我,在廖雪峰大神的帶領(lǐng)下,一起重新學(xué)習(xí)一下Git的使用吧
當然有人會說,這都9102年了,GitHub for Desktop、Source Tree、TortoiseGit、SmartGit了解一哈,確實,各種工具為我們屏蔽了復(fù)雜的命令,提供了方便。但是,如果你基本不怎么了解Git有什么命令,以及常用命令的作用,那么,在你遇到一些突發(fā)情況時,你往往無法處理(也是我的親身體會),所以我認為,雖然大部分時候我們還是會用工具去做事,但是還是有必要學(xué)習(xí)一下基本的命令
Git簡介+安裝
創(chuàng)建Git工程
初始化本地目錄
git init
//正常情況下,輸出如:
//Initialized empty Git repository in D:/work/code/gitLearning/project1/.git/
//就是成功啦
新建遠程倉庫
- 1.打開Github,注冊并登陸,這個就不詳細說了
-
2.
-
3.
- 4.
創(chuàng)建好就長這樣,有三個指引,分別對應(yīng)初始化一個本地庫并關(guān)聯(lián)到遠程庫關(guān)聯(lián)本地庫到遠程庫用其他遠程庫來初始化當前庫
關(guān)聯(lián)倉庫
關(guān)聯(lián)本地庫到遠程庫
git remote add origin git@github.com:NotSeriousCoder/GitLearning.git
git push -u origin master

首次提交,如上圖報錯,后來嘗試了,在本地工程目錄新建一個文件
aaa.txt(當然一般是新建一個README.md文件),然后提交如下:
git add
git commit -m "first commit"
git remote add origin git@github.com:NotSeriousCoder/GitLearning.git
git push -u origin master
//這里如果你的key設(shè)置了密碼,需要輸入密碼
//Enter passphrase for key '/c/Users/Bingor/.ssh/note':***
用其他遠程庫來初始化當前庫
-
1.
-
2.
-
3.導(dǎo)入中
-
4.導(dǎo)入完成
從遠程倉庫克隆
如果本地沒有倉庫,只有遠程倉庫,也可以直接從遠程克隆下來,如下:
git clone git@github.com:NotSeriousCoder/GitLearning.git
多人協(xié)作
提交代碼
//如果有新的文件/文件有變動
//git add 目的是讓Git追蹤文件變化,將文件的變化放入暫存區(qū)
git add xxx.xxx
//如果有多個文件變化,可使用 -A 來追蹤所有變動
git add -A
//如果不清楚有哪些文件有變化,可以使用git status,會列出上一個Commit之后的所有變動
git status
//如果嫌輸出的信息過于繁瑣,可使用 -s 來簡化輸出
git status -s
//提交
git commit -m "commit說明"
推送代碼到遠端
commit好代碼,我們通常需要將其推送到遠端倉庫(至少每天下班得推一次,不然太久不推,比較差異你就得瘋)
然而你不能直接把代碼推到遠端,因為你的小伙伴大概率也會去修改提交代碼
所以在推送之前,你需要將可能的遠端變更先拉取下來
//遠程主機名一般默認是origin,遠程分支名則是你需要拉取的遠程分支
//這句命令會執(zhí)行兩個操作,首先拉取遠端文件,然后嘗試跟本地文件合并
git pull <遠程主機名> <遠程分支名>
如果成功,長這樣:

如果失敗,長這樣:

你需要解決沖突,然后提交,再推送

你需要和一起開發(fā)的小伙伴確認應(yīng)該保留哪部分代碼,然后刪除與之沖突的

接下來把Merge add并提交,然后就可以push了(當然,理論上來說,在你解決沖突的期間,會不會遠端倉庫的文件又更新了呢?有可能的吧?所以也許需要再pull一次,看你具體需要了)
git push <遠程主機名> <本地分支名>:<遠程分支名>

回溯歷史
查看當前工作區(qū)與上次commit/add的差異
//會詳細列出當前工作區(qū)未暫存的修改內(nèi)容
git diff
//會詳細列出當前工作區(qū)中指定文件未暫存的修改內(nèi)容
git diff 文件名
//會詳細列出當前工作區(qū)中指定文件未暫存的修改內(nèi)容與某個指定版本的不同
git diff 版本號 文件名

增加的行,會以
+xxx的形式標注刪去的行,會以
-xxx的形式標注修改的行,會以
-原來的內(nèi)容 +現(xiàn)在的內(nèi)容標注
//上文提到過,可以總覽有哪些文件發(fā)生了修改
git status
//嫌輸出的信息太多,也可以簡略輸出
git status -s

修改過的文件,會以
M作為前綴刪除的文件,會以
D作為前綴新增的文件,會以
?作為前綴
還沒有commit,修改的內(nèi)容不想要了,想回退到上一次add/commit的狀態(tài)
- 如果已經(jīng)add
//必須先reset,否則無法checkout
git reset
git checkout xxx

- 如果還沒add
//沒有add的情況下,不需要reset
git checkout xxx

已經(jīng)commit,修改的內(nèi)容不想要了,想回退到上一次add/commit的狀態(tài)
//回退到上一個版本
git reset hard HEAD^
//回退到上N個版本
git reset hard HEAD~n
//回退到上指定版本
git reset --hard commit_id
//可以結(jié)合log命令,查看以往的提交,n表示查看最近n次提交記錄,不設(shè)置的話將展示所有歷史記錄
git log -n
分支管理
查看所有分支
git branch -a
新建一個分支
//你可以選擇
git checkout -b xxx
//或者
git branch xxx
區(qū)別在于,前者只創(chuàng)建分支,后者還會幫你切換過去

在某個特定commit的基礎(chǔ)上新建一個分支
會有這么一種場景,我想新建一個分支,但是當前版本包含了一些新分支不需要的變更,而前n個版本有適合用于新建分支的commit,那么,我們可以在那個commit的基礎(chǔ)上去新建分支。例如:

于是乎,我通過翻找log,找到一個合適的版本,id為:ae081072xxx(不需要完整的id,有前幾位即可,當然也不能太短)
//你可以選擇
git checkout -b xxx commitId
//或者
git branch xxx commitId
//commitId即代表你指定的版本對應(yīng)的commit

再看看項目目錄

切換分支
git checkout 分支名稱
切換分支前,需要提交當前工作區(qū)的變更,否則將會報錯

刪除分支
刪除需謹慎
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ——《不要問我為什么說這個話》
git branch -d 分支名稱
合并分支
//將指定分支合并到當前分支來
git merge 分支名

如果像我這樣遇到?jīng)_突
- 1.可以手動解決(前文有提及)
- 2.如果是某些文件單純的只使用某個分支的就行(比如A文件,想完全采用dev1分支的版本),可以使用命令
//ours表示采用當前分支版本
git checkout --ours 文件名
//theirs表示采用合并過來的分支版本
git checkout --theirs 文件名
需要注意,如果用的是rebase,那么ours跟theirs的意思相反(rebase的用法還沒吃透,這里不演示)
最后,提交即可

其他
//清空屏幕
reset
總結(jié)
本篇結(jié)合git的常用場景,介紹了git的部分命令,git的功能絕不僅限于此,更多的內(nèi)容有待我們?nèi)ネ诰?,目前我也只是用到了這些,以后隨著遇到的場景和問題的增加,我會陸續(xù)將更多的內(nèi)容分享上來
未完待續(xù)






