拾人牙慧系列--Git再學(xué)習(xí)

前言

本系列文章,將在各路大神文章的基礎(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簡介+安裝

Git簡介----不贅述,看大神的文章吧

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

首次push就報錯

首次提交,如上圖報錯,后來嘗試了,在本地工程目錄新建一個文件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 <遠程主機名> <遠程分支名>

如果成功,長這樣:


pull成功,無沖突

如果失敗,長這樣:


代碼Merge失敗

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

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

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

git push <遠程主機名> <本地分支名>:<遠程分支名>
push完成

回溯歷史

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

git diff 執(zhí)行結(jié)果

增加的行,會以+xxx的形式標注
刪去的行,會以-xxx的形式標注
修改的行,會以-原來的內(nèi)容 +現(xiàn)在的內(nèi)容標注

//上文提到過,可以總覽有哪些文件發(fā)生了修改
git status
//嫌輸出的信息太多,也可以簡略輸出
git status -s

git status -s 的執(zhí)行結(jié)果

修改過的文件,會以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
還沒add,直接checkout 即可
已經(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)建分支,后者還會幫你切換過去

創(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
執(zhí)行結(jié)果

再看看項目目錄


不希望保留的文件已經(jīng)消失
切換分支
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的用法還沒吃透,這里不演示)

最后,提交即可


merge完記得提交哦

其他

//清空屏幕
reset

總結(jié)

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


未完待續(xù)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

友情鏈接更多精彩內(nèi)容