git入門教程(超全!超詳細!)

如有任何地方須要修該,請及時聯繫,菜鳥一枚,多多指教。html

一、git安裝

git幾乎全部的平臺均可以安裝,安裝教程。
在Linux下安裝git
輸入git,查看系統是否存在git,若沒有安裝,它會提示你如何作。git

$ git
The program 'git' is currently not installed. You can install it by typing: sudo apt-get install git

若是是其餘Linux版本,能夠直接經過源碼安裝。先從Git官網下載源碼,而後解壓,依次輸入:./config,make,sudo make install這幾個命令安裝就行了。編程

在windows下安裝git
直接官網下載安裝vim

二、配置

git config --global user.name "Your Name"
git config --global user.email "email@example.com"

注意git config命令的--global參數,用了這個參數,表示你這臺機器上全部的Git倉庫都會使用這個配置,固然也能夠對某個倉庫指定不一樣的用戶名和Email地址。windows

題外話:我第一次安裝的時候忘記user.name和user.email了,它也是命令的一部分。
插一個須要注意的地方:
在提交代碼git add以前,須要先git status一下,看哪些須要提交,對於一個無用的文件好比說untracked文件,能夠用git clean刪除。
一樣切換分支的時候也須要先git status一下,而後根據它的提示來作就ok了。安全

三、建立版本庫

版本庫:
官方說法:這個目錄裏面的全部文件均可以被Git管理起來,每一個文件的修改、刪除,Git都能跟蹤,以便任什麼時候刻均可以追蹤歷史,或者在未來某個時刻能夠「還原」。服務器

其實簡單說就是管理代碼的倉庫,你全部的操做都在裏面。app

步驟:
(windows)首先選擇好你要將代碼放在哪裏。
切換分支ssh

通常公司中的許多人在開發同一個項目,須要在master分支下切一個dev子分支,每一個人也能夠切換本身的一個子分支,在開發完成後,在merge到主分支。ide

經常使用命令:

git branch #查看當前分支
git checkout -b dev #建立並切換子分支,dev可換成本身的分支名字
git checkout dev #切換分支
git branch dev #建立分支
git branch -d dev #刪除分支
git merge 分支名 #合併某分支到當前分支
git checkout -b dev origin/dev #建立遠程origin的dev分支到本地
注意:Linux服務器下,在本地建好分支後,將要本地分支推送到遠程服務上,使得遠程也存在該分支:git pull origin 本地分支:遠程分支
git remote add origin git@server-name:path/repo-name.git #將本地分支和遠程相關聯

mkdir+目錄名 #新建版本庫
touch+文件名 #新建文件(新建文件有兩種方式:
一、 touch+文件名,直接新建一個文件
二、 vi+文件名,新建一個文件並進入編輯狀態(若是文件已存在,則直接進入編輯狀態))
cd+目錄名 #進入目錄
pwd #顯示當前所在目錄的路徑
git init #初始化倉庫(把這個目錄變成Git能夠管理的倉庫)

提示:
(1)若是你沒有看到.git目錄,那是由於這個目錄默認是隱藏的,用ls -ah命令就能夠看見。
(2)git init後目錄裏面會多一個.git 文件,沒事千萬不要手動修改裏面的東西!!!!
(3)千萬不要使用Windows自帶的記事本編輯任何文本文件。

四、編寫代碼

編寫代碼的方式有兩種,一是你能夠本身新建文件,二是克隆公司其餘前輩的代碼,在此基礎上進行修改。

編寫代碼以前還須要生成並配置SSH-KEY(這個東東是將本地的工做區中的分支和遠程的分支進行關聯的)

#生成密鑰,一路回車、用默認選項
ssh-keygen -t rsa
#在本地(個人電腦或者計算機)中找到.ssh目錄,裏面有id_rsa和id_rsa.pub兩個文件(id_rsa是私鑰,id_rsa.pub是公鑰),將id_rsa.pub文件中的內容 複製到粘貼板
cat ~/.ssh/id_rsa.pub | clip # Windows
cat ~/.ssh/id_rsa.pub | pbcopy # MacOS

注意:粘貼的必定是.pub文件,裏面的是公鑰,另外一個文件不能隨便透露,裏面是私鑰。

克隆代碼
當你從遠程倉庫克隆時,實際上Git自動把本地的master分支和遠程的master分支對應起來了,而且,遠程倉庫的默認名稱是origin。

git clone 代碼庫地址

經常使用命令:
git remote #查看遠程庫信息
git remote -v #顯示更詳細信息
編寫代碼

若是使用的是Linux服務器的話,用vim打開該文件。

vim 文件名或者vi 文件名 #打開文件
:wq #保存退出

注意:強制退出能夠在後面加一個「!」,若對文件無任何修改能夠直接用「:q」進行突出

編寫完成提交代碼:
按如下步驟來就OK:

git status #查看版本庫中修改的文件,須要提交的文件,肯定要添加到暫存區的文件。
git add 修改的文件名 #將要提交的文件首先提交到暫存區
git status #查看版本庫的狀態
git commit -m "提交的說明" #編寫提交的說明便於之後查找
git log #查看提交記錄
git push origin 本地分支:遠程分支 #Linux服務器下將本地分支推送到遠程。(咱們須要code review,因此是 git push origin 本地分支:refs/for/遠程分支)

注意:推送的時候,可能會出錯衝突,那也咩關係,解決就是了!

解決辦法:
  git status查看衝突的文件(注意:Git用<<<<<<<(服務中的代碼),=======,>>>>>>>(本地中的代碼)標記出不一樣分支的內容,這種表示衝突。)
  在本地合併,解決衝突,再推送:git pull --->本地解決衝突--->git commit--->git push origin 分支名
  注意:若是git pull提示no tracking information,則說明本地分支和遠程分支的

連接關係沒有建立,用命令git branch --set-upstream-to <branch-name> origin/<branch-name>。

若是咱們想讓服務器代碼徹底替換和覆蓋咱們本地的代碼改動,那麼只須要執行
        git fetch origin
        git reset --hard origin/master

推送文件的步驟

先用git status 查看要提交的文件,
    用git add將全部的要提交的文件進行暫存,
    而後一次git commit就能夠。

注意順序:修改1->git add->修改2->git add->git commit

若是本地項目和遠程服務器的同一文件都有改動,那麼就會產生衝突,致使git pull 失敗
解決辦法:
先執行git stash指令,暫存當前的改動狀態,
再執行git pull指令,就能夠成功拉取服務器代碼,
再執行git stash pop,就能夠看到合併後的代碼改變。
本地解決衝突,再commit

經常使用命令:
git merge dev #當前在master分支,git merge是將某指定分支合併到當前分支
git diff #查看這個作過的修改
git branch -d 分支名** #刪除分支
git log #查看歷史記錄,顯示從最近到最遠的提交日誌

能夠添加 --pretty=oneline 參數

友情提示的是,你看到的一大串相似1094adb...的是commit id(版本號)

注意:HEAD表示當前版本,上一個版本就是HEAD^,上上一個版本就是HEAD^^,往上100個版本寫100個^比較容易數不過來,因此寫成HEAD~100

回退到上一個版本:git reset --hard HEAD^(撤銷到原先的最新版本,若沒有關界面的話,能夠往界面的上查找版本號,將HEAD^換成版本號,若已經關閉,能夠用 git reflog命令)
撤銷暫存區:git reset head <filename>
撤銷工做區的修改:git checkout -- filename
查看內容:cat 文件名
查看工做區和版本庫裏面最新版本的區別:git diff HEAD -- 文件名
撤銷工做區的全部修改:git checkout --文件名(分爲兩種,一種是回到和版本庫中的同樣,一種是回到上次暫存到暫存區的版本。命令中的「--」很重要)
撤銷已經提交到暫存區的版本,並從新放回工做區:git reset HEAD 文件名
建立文件:touch 文件名
刪除文件:rm 文件名(只是單純刪除文件)
刪除文件:#刪除 untracked files git clean -f
連 untracked 的目錄也一塊兒刪掉 git clean -fd
連 gitignore 的untrack 文件/目錄也一塊兒刪掉 (慎用,通常這個是用來刪掉編譯出來的 .o之類的文件用的)
git clean -xfd
在用上述 git clean 前,牆裂建議加上 -n 參數來先看看會刪掉哪些文件,防止重要文件被誤刪
git clean -nxfd
git clean -nf
git clean -nfd
刪除指定名詞目錄:rmdir name
上傳文件:rz #回車鍵,選擇要上傳的文件(Linux命令,不是git命令)
下載文件:sz 文件名(Linux命令,不是git命令)
移動文件:mv 文件名 path
複製文件:cp 文件名 新的文件名
重命名文件:mv 文件名 新的文件名
假設當前寫的東西進行到一半,有緊急任務,但當前的又不想提交:
git stash #將當前的工做儲藏起來,之後恢復繼續工做
git stash list #查看原先的工做
git stash apply #恢復儲存的工做
git stash drop #刪除原先儲存的工做或者git stash pop #恢復的同時也將stash內容刪除
git stash list #查看並無了
將工做區的文件已經刪除了:用git status查看哪些被刪除了,而後有兩種選擇:
(1)刪除版本庫的文件: git rm 文件名,而後git add ,git commit
(2)刪除工做區的文件:git checkout --文件名(用版本庫中的文件代替工做區的文件,一鍵還原)

查看分支合併圖:git log --graph

將已經add和commit的東西刪除:
因還未合併:git branch -D 分支名 #強行刪除

名詞解釋:
工做區:在電腦裏能看到的目錄
版本庫:工做區有一個隱藏目錄.git,Git的版本庫裏存了不少東西,其中最重要的就是稱爲stage(或者叫index)的暫存區,還有Git爲咱們自動建立的第一個分支master,以及指向master的一個指針叫HEAD。

不過重要的:
標籤
步驟:
git branch #查看須要打標籤的分支
git tag <name> #打標籤,name是你想起的名字
git tag #查看全部打標籤的分支
忘記打標籤:git log --pretty=oneline --abbrev-commit,找到版本號,git tag <name> 版本號,查看全部的tag分支
注意:標籤是按字母排序的,git show <tagname>查看標籤信息
git tag -a v0.1 -m "version 0.1 released" 1094adb #建立帶說明的標籤,用-a指定標籤名,-m指定說明文字
git show <tagname> #查看說明文字

注意:
標籤老是和某個commit掛鉤。若是這個commit既出如今master分支,又出如今dev分支,那麼在這兩個分支上均可以看到這個標籤。
由於建立的標籤都只存儲在本地,不會自動推送到遠程。因此,打錯的標籤能夠在本地安全刪除。
若是要推送某個標籤到遠程,使用命令git push origin <tagname>
一次性推送所有還沒有推送到遠程的本地標籤 git push origin --tags
刪除遠程標籤:先本地刪除:git tag -d v0.9,再遠程刪除:git push origin :refs/tags/v0.9

小知識:
(1)git status顯示一些Untracked files ...文件,在根目錄下建立.gitignore文件,而後把要忽略的文件名填進去,Git就會自動忽略這些文件。

忽略文件的原則是:

忽略操做系統自動生成的文件,好比縮略圖等;
忽略編譯生成的中間文件、可執行文件等,也就是若是一個文件是經過另外一個文件自動生成的,那自動生成的文件就不必放進版本庫,好比Java編譯產生的.class文件;
忽略你本身的帶有敏感信息的配置文件,好比存放口令的配置文件。

多是.gitignore寫得有問題,能夠用git check-ignore命令檢查。

(2)簡寫,配置別名

git config --global alias.st status #st表明status
其他:
co表示checkout,ci表示commit,br表示branch

五、vim的使用

鍵盤圖
圖片描述

模式切換

clipboard.png

移動光標
shift 6() 至本行第一個非空字符
shift 4($) 至本行末尾
w 至下一個單詞、標點開頭
W 至下一個單詞開頭
b 至上一個單詞、標點開頭
B 至上一個單詞開頭
ctrl + b 上翻一頁
ctrl + f 下翻一頁
ctrl + d 向下翻半頁 此比較有用
ctrl + u 向上翻半頁 此比較有用
gg 文件開頭
shift + g 文件末尾
num + shift + g 跳到第num行
「 兩個單引號 此命令至關有用, 它移動光標到上一個標記處, 好比用 gd, * 等查找到某個單詞後, 再輸入此命令則回到上次停留的位置.
‘. 一單一點 此命令至關好使, 它移動光標到上一次的修改行.
`. 一倒引一點 此命令至關強大, 它移動光標到上一次的修改點.
進入插入模式
i, I 進入輸入模式(Insert mode): i 爲『從目前光標所在處輸入』, I 爲『在目前所在行的第一個非空格符處開始輸入』。 (經常使用)
a, A 進入輸入模式(Insert mode): a 爲『從目前光標所在的下一個字符處開始輸入』, A 爲『從光標所在行的最後一個字符處開始輸入』。(經常使用)
o, O 進入輸入模式(Insert mode): 這是英文字母 o 的大小寫。o 爲『在目前光標所在的下一行處輸入新的一行』; O 爲在目前光標所在處的上一行輸入新的一行!(經常使用)
r, R 進入取代模式(Replace mode): r 只會取代光標所在的那一個字符一次;R會一直取代光標所在的文字,直到按下 ESC 爲止;(經常使用)
[Esc] 退出編輯模式,回到通常模式中(經常使用)
文本編輯(刪除、複製、剪切、粘貼、撤銷)
x 刪除當前字符
3x 刪除當前字符和以後的兩個字符
dd 刪除(剪切)當前那行
5dd 刪除(剪切)當前那行和後面的4行
dw 當前字符到下一個字符開始
d$ 刪除(剪切)當前字符到行尾
d0 刪除(剪切)當前字符到行首
d^ 刪除(剪切)當前字符到下一個非空字符
dG 刪除(剪切)當前行到文件末尾
d20G 刪除(剪切)當前行到20行
yy 複製當前那行,用法同dd
p 粘貼到光標以後
P 粘貼到光標以前
u 取消上一次操做
ctrl +r 恢復上一次操做
j 合併當前行和後面的一行,用法同dd
查找替換
/key(?key) 向下(上)查找key
:%s/oldkey/newkey/gc 在全局範圍內用newkey替換oldkey
: 進入底行模式
% 範圍%表明全局,1,3表明1到3行
s 替換操做
/oldkey/newkey/ 用新詞替換老詞
g 表明行內全局

編輯多個文件
vim file1 file2 … 編輯多個文件
:n 切換到下一個文件
:N 切換到上一個文件
:buffer 1 切換到第一個文件
:e file 新編輯一個文件
:r file 在當前文件中插入一個文件
:w file 將文件保存爲一個文件
**技巧**r 替換模式,替換當前光標所在位置的一個字符。雖然你一樣能夠i進入插入模式,而後刪掉那個字符,再輸入須要的字符,但這種操做是鼠標流思惟方式。替換是一個可重複操做,多用沒壞處。cw change word能夠刪除從當前位置到一個單詞的結尾,並進入插入模式。這種操做經常使用於修改一個變量。好比對於:int count=0;但願把count改爲cnt,那麼當光標位於c字符處的時候,按cw可直接刪除count,並進入插入模式。而後直接繼續輸入cnt便可。caw change a word能夠刪除當前光標所在位置的單詞。對於int count=0;的例子,若是此時光標在count中間某處,好比u處,直接鍵入caw能夠達到一樣的效果。因此caw更強大一些。c$、c^ 觸類旁通,能夠猜到c$是從當前位置刪除到行尾,並進入插入模式。ci」 change inside 能夠用於修改當前位置附近,在相同配對的中的內容。好比對於const char *str=hello world;。當在雙引號中間的任意位置鍵入ci"能夠直接清空字符串,並繼續輸入新的但願的字符串。ci(、ci[ 觸類旁通change inside ( change inside [。cit 這個比較特殊,能夠直接編輯匹配的xml標籤中的內容!常常編寫html的童鞋能夠熟悉一下。yi" yank inside 猜猜是啥意思?相似ci只是把編輯操做編程複製操做,由於y是複製!是否是很強大。ya" yank around 「 複製整個字符串,包括雙引號。yw、yaw、daw、d$… 好了,這些能夠發明出來了。

相關文章
相關標籤/搜索