用git管理你的項目吧(最全的乾貨)

git是什麼?

Git是一個開源的分佈式版本控制系統,能夠有效、高速的處理從很小到很是大的項目版本管理。Git 是 Linus Torvalds 爲了幫助管理 Linux 內核開發而開發的一個開放源碼的版本控制軟件。html

git的用途

我的理解:linux

  • git是一個很是好的多人協做的工具,並且功能也十分強大。
  • 對於我的來講,git是管理你寫的大大小小項目的一個工具,你能夠把你寫的筆記、代碼上傳到遠程倉庫,也能夠在遠程倉庫clone別人寫的項目查看別人寫的筆記。官方遠程倉庫github,也有國內倉庫碼雲。

git的安裝

在windows上安裝gitgit

在linux上安裝gitgithub

github的註冊和使用

github適合我的使用,這裏我只講述鏈接遠程倉庫的兩種方式。vim

  • 第一種:HTTPS方式windows

  • 第二種:SSH方式,對於初學者,不知道ssh在哪裏,個人在C:\Users\asus.ssh,找到id_rsa.pub,以記事本的方式打開復制,登陸到本身的github,點擊右上角的頭像,再點擊Settings,找到SSH and GPK keys 點擊 ,右上角有個New SSH key 的按鈕點擊,隨便填一個Title,再把你剛纔複製的東西粘貼到Key框裏,而後點擊Add SSH key,就能夠用SSH克隆項目了。 (若是找不到.ssh,在計算機裏搜索)緩存

git配置全局變量

配置用戶名郵箱:

git config --global user.name stefan
git config --global user.email 502681863@qq.com
複製代碼

這樣你提交的遠程分支就顯示你的信息了。bash

固然你也能夠找到git的配置文件.gitconfig,進行修改。個人在C:\Users\asus下面,若是找不到能夠搜索文件名.gitconfig。服務器

個人以記事本打開是這樣的:app

[user]
	name = Stefan
	email = 502681863@qq.com
	signingkey = stefan0712
[credential]
	helper = manager
[filter "lfs"]
	clean = git-lfs clean -- %f
	smudge = git-lfs smudge -- %f
	process = git-lfs filter-process
	required = true
[color]
	ui = true
[alias]
	st = status
	cm = commit -m
	ck = checkout
	plo = pull origin
	ps = push
	a =add .
複製代碼

剛纔以命令設置的name和email都在這個文件裏。

git使用邏輯

我的使用:

想把本地的一個項目上傳到github,而且以前也沒有與遠程有管理。

步驟:

  1. 打開項目文件夾,右擊選中Git Bush Here,打開git命令框,輸入git init 即把當前的目錄變成能夠管理的git倉庫,生成隱藏.git文件。
  2. 在github裏新建一個項目,複製HTTPS地址或者SSH地址
  3. 在git命令裏輸入git remote add origin https://github.com/StefanPython/demo.git與遠程新建的項目創建鏈接。
  4. 查看遠程庫的信息,輸入命令git remote,顯示origin就證實創建鏈接成功。
  5. 如今就能夠上傳項目到遠程倉庫了,git status 查看文件在git倉庫中的狀態,顯示紅色說明文件還在本地工做區
  6. 命令行輸入git add . 將全部的文件添加到暫存區,如今git status 文件顯示綠色。
  7. 命令行輸入git commit -m "新建什麼,修改什麼",這樣就是把文件提交到版本庫
  8. git push -u origin master 將項目推送到遠程倉庫(同時也將本地分支master推送到遠程),登上github打開剛新建的項目,刷新就會出現你推送的東西。(第一次推送要加-u,這樣之後就能夠直接git push,不用再加 origin master)
  9. 實際工做中對本地項目的修改再推送到遠程就是重複5-8的步驟

在遠程先創建一個項目,把空項目clone到本地

步驟:

  1. 在github上新建一個空項目,複製HTTPS或者SSH
  2. 在本地盤中隨便找一個地方右鍵打開git命令窗,輸入git clone git@github.com:StefanPython/demo.git 本地就會出現一個和遠程同樣的項目,而且已經和遠程創建了來接。
  3. 如此就可使用命令
git status
git add .
git commit -m "修改"
git push(這裏是直接能夠push的,由於把遠程master也克隆下來了)
複製代碼

多人協做

多人協做和我的協做的最大區別是,多我的在一個分支下提交,這就避免不了有衝突。我的使用的時候應該是幾乎不會出現衝突。

多人協做步驟:

  1. 新建項目,默認有一個主分支master,還要新建一個develop分支,簡稱dev,通常都是在dev分支下工做的,到最後項目測試基本完成,要發佈了,就把dev分支下的項目合併到master分支上。master分支基本不作改動,只作項目版本的更新。
  2. 讓每個協做者克隆遠程項目到本地,天然也就克隆了master分支和dev分支,切換到dev分支下進行工做。
  3. 有時候別人修改了一個地方已經提交到遠程了,本身也修改了一樣的地方,本身也要push時卻失敗了,這是由於遠程項目的版本是最新的,可能和你修改的有衝突,因此每次push前先git pull ,把遠程下拉後解決衝突再push就能夠成功了。
  4. 固然你也能夠在本地創建一個本身的分支dev_name,平時工做在本身分支下工做,等要push到遠程的時候就切換到dev分支下git merge dev_name 把dev_name 下的代碼合併到dev下就能夠了。
git checkout dev(切換到dev分支)
git status
git add .
git commit -m "修改"
git pull origin dev
git push

git checkout –b dev_xfy(建立並切換到dev_xfy分支下)
git checkout dev
git merge dev_xfy(合併dev_xfy到dev)
git pull origin dev
git push
複製代碼

解決衝突:

當兩個分支在同一個文件的同一個位置作了修改時,兩者合併時會出現衝突,查看衝突,留下正確的修改,從新 git add b.txt git commit -m'衝突已解決'。

其實解決衝突也很簡單,當衝突出現時,git status 會告訴你哪些文件有衝突(顯示紅色的文件),在項目中找到相應的文件 看到相似的

<<<<<<< HEAD
Creating a new branch is quick & simple.
=======
Creating a new branch is quick AND simple.
>>>>>>> dev_xfy
複製代碼

Git用<<<<<<<,=======,>>>>>>>標記出不一樣分支的內容,咱們把這些標記刪掉,留下正確的代碼就能夠了。

碼雲的使用

爲何要使用碼雲呢,由於碼雲是中文的,而且它更適合多人協做,一個組織的管理。

一樣的使用方法和github很相似,首先得註冊一個碼雲帳號。接下來就是配置SSH,和github過程基本同樣。

git經常使用命令總結:

mkdir:         XX (建立一個空目錄 XX指目錄名)
&emsp;&emsp;pwd:          顯示當前目錄的路徑。
&emsp;&emsp;git init          把當前的目錄變成能夠管理的git倉庫,生成隱藏.git文件。
&emsp;&emsp;git add XX       把xx文件添加到暫存區去。
&emsp;&emsp;git commit –m 「XX」  提交文件 –m 後面的是註釋。
&emsp;&emsp;git status        查看倉庫狀態
&emsp;&emsp;git diff  XX      查看XX文件修改了那些內容
&emsp;&emsp;git log          查看歷史記錄
&emsp;&emsp;git reset  --hard HEAD^ 或者 git reset  --hard HEAD~ 回退到上一個版本
&emsp;&emsp;(若是想回退到100個版本,使用git reset –hard HEAD~100 )
&emsp;&emsp;cat XX         查看XX文件內容
&emsp;&emsp;git reflog       查看歷史記錄的版本號id
&emsp;&emsp;git checkout -- XX  把XX文件在工做區的修改所有撤銷。
&emsp;&emsp;git rm XX          刪除XX文件
&emsp;&emsp;git remote add origin https://github.com/StefanPython/demo.git 關聯一個遠程庫
&emsp;&emsp;git push –u(第一次要用-u 之後不須要) origin master 把當前master分支推送到遠程庫
&emsp;&emsp;git clone https://github.com/tugenhua0707/testgit  從遠程庫中克隆
&emsp;&emsp;git checkout –b dev  建立dev分支 並切換到dev分支上
&emsp;&emsp;git branch  查看當前全部的分支
&emsp;&emsp;git checkout master 切換回master分支
    git branch -m newname 修改當在分支
    git branch -m oldname newname 修改其餘分支名字
&emsp;&emsp;git merge dev    在當前的分支上合併dev分支
&emsp;&emsp;git branch –d dev 刪除dev分支
&emsp;&emsp;git branch name  建立分支
&emsp;&emsp;git stash 把當前的工做隱藏起來 等之後恢復現場後繼續工做
&emsp;&emsp;git stash list 查看全部被隱藏的文件列表
&emsp;&emsp;git stash apply 恢復被隱藏的文件,可是內容不刪除
&emsp;&emsp;git stash drop 刪除文件
&emsp;&emsp;git stash pop 恢復文件的同時 也刪除文件
&emsp;&emsp;git remote 查看遠程庫的信息
&emsp;&emsp;git remote –v 查看遠程庫的詳細信息
&emsp;&emsp;git push origin master  Git會把master分支推送到遠程庫對應的遠程分支上
    git branch --merged顯示已經所有合併到當前分支的分支
    git branch --no-merged顯示沒有合併到當前分支的分支
      若是要丟棄一個沒有被合併過的分支,能夠經過git branch -D <name>強行刪除。

複製代碼
查看日誌:
                git log
                有更好的格式 git log --pretty=oneline
                查看全部操做日誌git reflog
版本回退:
                git reset --hard head^ 回到上一個版本
                git reset --hard 版本號 想回到的版本號
                得到版本號的命令 git reflog
撤銷上一次的修改(未提交的而且是在緩存區的):
                git checkout  -- 文件名  在暫存區修改文件未提交,可用此命令撤銷當前未提交的修改,若是有多個文件修改須要撤銷  git checkout -- .
                git reset --hard head 定位到當前提交狀態指針,當一個暫存區文件修改後未提交時等同於git checkout -- 文件名
     注意:命令git checkout -- readme.txt 中的 -- 很重要,若是沒有 -- 的話,那麼命令變成建立分支了。
               只要沒有commit均可以還原
鏈接遠程倉庫:
                  git remote add origin1 https://github.com/xfy007/gitsecond.git  添加測試用的遠端倉庫
                  git push -u origin1 master  每次咱們要提交代碼到服務器上時,都會使用到git push。git push命令會有兩個參數,遠端倉庫的名字,以及分支的名字
                 因爲遠程庫是空的,咱們第一次推送master分支時,加上了 –u參數,Git不但會把本地的master分支內容推送的遠程新的master分支,還會把本地的master分支和遠程的master分支關聯起來,在之後的推送或者拉取時就能夠簡化命令。經後可直接git push
從遠程倉庫克隆:
               git clone https://github.com/xfy007/gitsecond.git

總結建立與合併分支命令以下:
&emsp;&emsp;          查看分支:git branch
&emsp;&emsp;          建立分支:git branch name
&emsp;&emsp;          切換分支:git checkout name
&emsp;&emsp;          建立+切換分支:git checkout –b name
&emsp;&emsp;          合併某分支到當前分支:git merge name
&emsp;&emsp;          刪除分支:git branch –d name

保存工做現場:
        當一個分支上的工做還沒完成,不能提交時,可是有一個bug須要我再主分支上新建一個分支去解決,因此用到
        git  stash 來保存工做現場
        git status 查看沒有未提交的工做
        要恢復工做現場 方法一:git stash pop (恢復並刪除stash內容)法二:git stash apply(恢復)   , git stash drop(一個個刪除)
查看SSH公鑰的相關命令:
ssh-keygen  從新生成SSH公鑰
cd ~/.ssh 切換到.ssh目錄下
ll -a 查看.ssh下有哪些文件
cat ~/.ssh/id_rsa.pub  查看ssh  key
複製代碼

注:命令無須強記,多使用,就會熟練。

爲git命令設置別名:

每次輸那麼長的命令,感受效率很低,也很麻煩。能夠把這些長命令設置別名。

如: git status 設置成 git st

git add . 設置成git a

git commit -m 設置成 git cm

有命令修改別名可是一個一個修改好麻煩,你能夠再次找到.gitconfig文件,打開,找到[alias]標籤,以下

[alias]
	st = status
	cm = commit -m
	ck = checkout
	plo = pull origin
	ps = push
	a =add .
複製代碼

照這個樣子修改就好了。

能夠從git裏打開.gitconfig文件 命令以下

cd
cat .gitconfig
vim .gitconfig  (進入vim編輯器)
在英文輸入法下按i,進入輸入模式,修改完成後,在英文輸入法下點ESC,在點shift+:底部就會出現一個:,輸入wq,就保存退出了
再經過cat .gitconfig查看是否修改

複製代碼

git 相關概念的理解:

工做區:

將一個文件夾經過git init 設置成一個git能夠管理的文件夾時,這個文件夾裏的內容就是工做區。

暫存區:

暫存區,叫stage 或者 index ,是用來暫時存放工做區中修改的內容; 能夠理解爲一箇中轉站

版本庫:

經過git init 會生成一個隱藏的文件.git,這個,git裏的東西就是版本庫

master:

master是主分支,當咱們git init後,並不會馬上產生master, 而是咱們添加了一個文件,並git add .,git commit後, 這時咱們查看分支狀況, 即可以看到master分支了。(分支都存放在.git/head/refs目錄下)

HEAD:

HEAD是一個引用,引用的是當前的分支, 若是當前處於master分支,那麼HEAD就會指向master。

注:對三個區(工做區,暫存區、版本庫)有影響的幾個命令

git add   當咱們使用git add 指令時,就是將對應修改的文件添加到暫存區中
這時,暫存區中的目錄樹被更新。

git commit 咱們使用git commit指令,便會將暫存區中作出的修改提交到版本庫中
這時master指向的分支被更新。

git reset HEAD  當使用git reset HEAD 指令時,版本庫的內容會回退到暫存區。

git checkout --file 使用git checkout --file時,是將工做區指定修改的文件被暫存區的內容覆蓋(消除全部工做區進行的改動),這個動做很危險。
git checkout . 也是如此,該指令是將全部修改的文件被暫存區的內容覆蓋。

git rm --cached 使用git rm --cached file時,直接從暫存區進行文件的刪除,不會影響工做區的內容。

git checkout HEAD --file git checkout  HEAD --flie 時,會將版本庫中的對應的文件內容直接替換工做區和暫存區中的該文件。
這個動做也是危險的,一樣git checkout HEAD . 是將全部的內容替換工做區和暫存區的文件。
複製代碼

查看三個分區的區別:

git diff 查看工做區和暫存區的區別
git diff --cached 查看暫存區和版本庫之間的區別
git diff HEAD 查看工做區和版本庫之間的區別
git status 查看當前的工做狀態
複製代碼

學到最後,其實仍是雲裏霧裏的,先不急,一個git也就這麼多,不必去深究,會用就行。只要用起來,在實踐中學習,會理解更深入。時間會慢慢解開你的疑惑。

有任何疑問請留言評論。

相關文章
相關標籤/搜索