前言
本系列文章催跪,將在各路大神文章的基礎(chǔ)上,總結(jié)提煉出自己的感悟夷野,力求將大神的觀點總結(jié)的更加凝練懊蒸,希望站在巨人的肩膀上,能看得更遠
請務(wù)必先在無實際作用的測試工程中練習Git命令
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ——《魯迅沒說過的話精選集》
在還沒有很熟悉Git命令之前悯搔,請務(wù)必先確認輸入的指令是否是你想要的效果骑丸,如果不能確定,還是先使用可視化工具
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ——《跑路程序員告誡你的二三事》
本篇引用文章
廖雪峰大神的專題文章--史上最淺顯易懂的Git教程!
另外通危,參考了這里:
易百教程--Git教程
內(nèi)容提要
作為一名程序員铸豁,Git/SVN是我們每天都要打交道的東西(本篇不討論SVN),然而菊碟,我們真的會用Git嗎节芥?你是不是也和我一樣,只會git clone
git pull
git commit
git push
呢逆害?如果你也是头镊,請跟隨我,在廖雪峰大神的帶領(lǐng)下忍燥,一起重新學習一下Git的使用吧
當然有人會說拧晕,這都9102年了,GitHub for Desktop梅垄、Source Tree厂捞、TortoiseGit、SmartGit了解一哈队丝,確實靡馁,各種工具為我們屏蔽了復(fù)雜的命令,提供了方便机久。但是臭墨,如果你基本不怎么了解Git有什么命令,以及常用命令的作用膘盖,那么胧弛,在你遇到一些突發(fā)情況時,你往往無法處理(也是我的親身體會)侠畔,所以我認為结缚,雖然大部分時候我們還是會用工具去做事,但是還是有必要學習一下基本的命令
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.導入中
-
4.導入完成
從遠程倉庫克隆
如果本地沒有倉庫,只有遠程倉庫服球,也可以直接從遠程克隆下來茴恰,如下:
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ù)