廖雪峰Git教程筆記

weixin_33912246發表於2018-02-08

[TOC]

本文是總結廖雪峰Git教程的筆記。

git 賬號配置

$ git config --global user.name "Your Name" #設定使用者名稱
$ git config --global user.email "email@example.com" # 設定郵箱
$ git config --global color.ui true #設定彩色UI

git初始化倉庫

$ git init

git 新增檔案

用git add把檔案新增進去,實際上就是把檔案修改新增到暫存區;

$ git add readme.txt

git 提交檔案

用git commit提交更改,實際上就是把暫存區的所有內容提交到當前分支。

$ git commit -m "wrote a readme file"

git 檢視狀態

命令可以讓我們時刻掌握倉庫當前的狀態,上面的命令告訴我們,readme.txt被修改過了,但還沒有準備提交的修改。

$ git status
# On branch master
# Changes not staged for commit:
#   (use "git add <file>..." to update what will be committed)
#   (use "git checkout -- <file>..." to discard changes in working directory)
#
#    modified:   readme.txt
#
no changes added to commit (use "git add" and/or "git commit -a")

git 比對修改部分

$ git diff readme.txt 
diff --git a/readme.txt b/readme.txt
index 46d49bf..9247db6 100644
--- a/readme.txt
+++ b/readme.txt
@@ -1,2 +1,2 @@
-Git is a version control system.
+Git is a distributed version control system.
 Git is free software.

git 檢視提交記錄

$ git log
commit 3628164fb26d48395383f8f31179f24e0882e1e0
Author: Michael Liao <askxuefeng@gmail.com>
Date:   Tue Aug 20 15:11:49 2013 +0800

    append GPL

commit ea34578d5496d7dd233c827ed32a8cd576c5ee85
Author: Michael Liao <askxuefeng@gmail.com>
Date:   Tue Aug 20 14:53:12 2013 +0800

    add distributed

commit cb926e7ea50ad11b8f9e909c05226233bf755030
Author: Michael Liao <askxuefeng@gmail.com>
Date:   Mon Aug 19 17:51:55 2013 +0800

    wrote a readme file

如果嫌輸出資訊太多,看得眼花繚亂的,可以試試加上--pretty=oneline引數:

$ git log --pretty=oneline
3628164fb26d48395383f8f31179f24e0882e1e0 append GPL
ea34578d5496d7dd233c827ed32a8cd576c5ee85 add distributed
cb926e7ea50ad11b8f9e909c05226233bf755030 wrote a readme file

git 回退到某次提交

Git必須知道當前版本是哪個版本,在Git中,用HEAD表示當前版本,也就是最新的提交3628164...882e1e0(注意我的提交ID和你的肯定不一樣),上一個版本就是HEAD^ ,上上一個版本就是HEAD^^ ,當然往上100個版本寫100個^比較容易數不過來,所以寫成HEAD~100。

$ git reset --hard HEAD^
HEAD is now at ea34578 add distributed

只要上面的命令列視窗還沒有被關掉,你就可以順著往上找啊找啊,找到那個append GPL的commit id是3628164...,於是就可以指定回到未來的某個版本

版本號沒必要寫全,前幾位就可以了,Git會自動去找。當然也不能只寫前一兩位,因為Git可能會找到多個版本號,就無法確定是哪一個了。

$ git reset --hard 3628164
HEAD is now at 3628164 append GPL

git 顯示之前的命令

$ git reflog
ea34578 HEAD@{0}: reset: moving to HEAD^
3628164 HEAD@{1}: commit: append GPL
ea34578 HEAD@{2}: commit: add distributed
cb926e7 HEAD@{3}: commit (initial): wrote a readme file

git 撤銷修改

$ git checkout -- readme.txt

命令git checkout -- readme.txt意思就是,把readme.txt檔案在工作區的修改全部撤銷,這裡有兩種情況:
一種是readme.txt自修改後還沒有被放到暫存區,現在,撤銷修改就回到和版本庫一模一樣的狀態;
一種是readme.txt已經新增到暫存區後,又作了修改,現在,撤銷修改就回到新增到暫存區後的狀態。
總之,就是讓這個檔案回到最近一次git commit或git add時的狀態。

如果新增到了暫存區,還沒有提交,用命令git reset HEAD file可以把暫存區的修改撤銷掉(unstage),重新放回工作區:

$ git reset HEAD readme.txt
Unstaged changes after reset:
M       readme.txt

git reset命令既可以回退版本,也可以把暫存區的修改回退到工作區。當我們用HEAD時,表示最新的版本。

然後再

$ git checkout -- readme.txt

git 刪除檔案

$ git rm test.txt
rm 'test.txt'
$ git commit -m "remove test.txt"
[master d17efd8] remove test.txt
 1 file changed, 1 deletion(-)
 delete mode 100644 test.txt

如果是刪錯了,因為版本庫裡還有呢,所以可以很輕鬆地把誤刪的檔案恢復到最新版本:

$ git checkout -- test.txt

git checkout其實是用版本庫裡的版本替換工作區的版本,無論工作區是修改還是刪除,都可以“一鍵還原”。


git 建立祕鑰

第1步:建立SSH Key。在使用者主目錄下,看看有沒有.ssh目錄,如果有,再看看這個目錄下有沒有id_rsa和id_rsa.pub這兩個檔案,如果已經有了,可直接跳到下一步。如果沒有,開啟Shell(Windows下開啟Git Bash),建立SSH Key:

$ ssh-keygen -t rsa -C "youremail@example.com"

第2步:登陸GitHub,開啟“Account settings”,“SSH Keys”頁面,然後,點“Add SSH Key”,填上任意Title,在Key文字框裡貼上id_rsa.pub檔案的內容


git 新增遠端庫

$ git remote add origin git@github.com:michaelliao/learngit.git

新增後,遠端庫的名字就是origin,這是Git預設的叫法,也可以改成別的,但是origin這個名字一看就知道是遠端庫。

$ git push -u origin master
Counting objects: 19, done.
Delta compression using up to 4 threads.
Compressing objects: 100% (19/19), done.
Writing objects: 100% (19/19), 13.73 KiB, done.
Total 23 (delta 6), reused 0 (delta 0)
To git@github.com:michaelliao/learngit.git
 * [new branch]      master -> master
Branch master set up to track remote branch master from origin.

把本地庫的內容推送到遠端,用git push命令,實際上是把當前分支master推送到遠端。

由於遠端庫是空的,我們第一次推送master分支時,加上了-u引數,Git不但會把本地的master分支內容推送的遠端新的master分支,還會把本地的master分支和遠端的master分支關聯起來,在以後的推送或者拉取時就可以簡化命令。

$ git push origin master

git 克隆遠端庫

$ git clone git@github.com:michaelliao/gitskills.git
Cloning into 'gitskills'...
remote: Counting objects: 3, done.
remote: Total 3 (delta 0), reused 0 (delta 0)
Receiving objects: 100% (3/3), done.

$ cd gitskills
$ ls
README.md

git 檢視分支

$ git branch

git 建立分支

$ git branch <name>

git 切換分支

$ git checkout <name>

git 建立並切換分支

$ git checkout -b <name>

git 合併某分支到當前分支

$ git merge <name>

git 刪除分支

$ git branch -d <name>

git 強制刪除

$ git branch -D feature-vulcan

分支開發策略

在實際開發中,我們應該按照幾個基本原則進行分支管理:

首先,master分支應該是非常穩定的,也就是僅用來發布新版本,平時不能在上面幹活;
那在哪幹活呢?幹活都在dev分支上,也就是說,dev分支是不穩定的,到某個時候,比如1.0版本釋出時,再把dev分支合併到master上,在master分支釋出1.0版本;
你和你的小夥伴們每個人都在dev分支上幹活,每個人都有自己的分支,時不時地往dev分支上合併就可以了。

所以,團隊合作的分支看起來就像這樣:


278619-654221934bedc00a.png
git.png

git 儲存工作區

$ git stash

git 檢視儲存的狀態

$ git stash list

git 恢復工作區

$ git stash apply

但是恢復後,stash內容並不刪除,你需要用git stash drop來刪除;

git 刪除儲存的工作區

$ git stash drop

git 恢復工作區並刪除儲存狀態

$ git stash pop

git 檢視遠端庫資訊

$ git remote -v

git 推送分支

$ git push origin <branch-name>

git 拉取分支

$ git pull

git 指定本地分支與遠端分支的對應關係

$ git branch --set-upstream dev origin/dev

多人協作的工作模式

  1. 首先,可以試圖用git push origin branch-name推送自己的修改
  2. 如果推送失敗,則因為遠端分支比你的本地更新,需要先用git pull試圖合併
  3. 如果合併有衝突,則解決衝突,並在本地提交;
  4. 沒有衝突或者解決掉衝突後,再用git push origin branch-name推送就能成功!

如果git pull提示“no tracking information”,則說明本地分支和遠端分支的連結關係沒有建立,用命令git branch --set-upstream branch-name origin/branch-name。

git 建立標籤(標籤就是某條commit的別名)

預設標籤是打在最新提交的commit上的

$ git tag v1.0

git 建立標籤到指定commit

$ git tag v0.9 6224937

git 建立帶說明的標籤(用-a指定標籤名,-m指定說明文字)

$ git tag -a v0.1 -m "version 0.1 released" 3628164

git 檢視所有標籤

$ git tag

git 刪除標籤

$ git tag -d v0.1

git 推送指定標籤到遠端

$ git push origin <tagname>

git 推送全部未推送過的本地標籤

$ git push origin --tags

git 刪除遠端指定標籤

$ git push origin :refs/tags/<tagname>

相關文章