廖雪峰Git教程筆記
[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分支上合併就可以了。
所以,團隊合作的分支看起來就像這樣:
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
多人協作的工作模式
- 首先,可以試圖用git push origin branch-name推送自己的修改
- 如果推送失敗,則因為遠端分支比你的本地更新,需要先用git pull試圖合併
- 如果合併有衝突,則解決衝突,並在本地提交;
- 沒有衝突或者解決掉衝突後,再用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>
相關文章
- 廖雪峰Git學習筆記1-Git簡介Git筆記
- 【廖雪峰python入門筆記】dictPython筆記
- 【廖雪峰python入門筆記】setPython筆記
- 【廖雪峰python入門筆記】切片Python筆記
- 【廖雪峰python入門筆記】迭代Python筆記
- 【廖雪峰python進階筆記】模組Python筆記
- 20190228 學習筆記——廖雪峰 git筆記Git
- 【廖雪峰python入門筆記】函式Python筆記函式
- 【廖雪峰python入門筆記】變數Python筆記變數
- 【廖雪峰python入門筆記】if語句Python筆記
- 【廖雪峰python入門筆記】for迴圈Python筆記
- 【廖雪峰python入門筆記】列表生成式Python筆記
- 【廖雪峰python進階筆記】定製類Python筆記
- 【廖雪峰python入門筆記】list_建立Python筆記
- 【廖雪峰python入門筆記】tuple_建立Python筆記
- 【廖雪峰python入門筆記】while迴圈Python筆記While
- 【廖雪峰python入門筆記】多重迴圈Python筆記
- 【廖雪峰python進階筆記】類的繼承Python筆記繼承
- 【廖雪峰python入門筆記】break和continuePython筆記
- 【廖雪峰python入門筆記】list刪除元素_pop()Python筆記
- 【廖雪峰python入門筆記】list_替換元素Python筆記
- 【廖雪峰python入門筆記】tuple_“元素可變”Python筆記
- 【廖雪峰python入門筆記】tuple_建立單元素Python筆記
- 廖雪峰《Python3 基礎教程》讀書筆記——第一、第二章Python筆記
- 【廖雪峰python進階筆記】物件導向程式設計Python筆記物件程式設計
- 【廖雪峰python入門筆記】字串_轉義字元的使用Python筆記字串字元
- 【廖雪峰python入門筆記】raw 字串和多行字串表示Python筆記字串
- 【廖雪峰python入門筆記】整數和浮點數Python筆記
- 【廖雪峰python入門筆記】list_按照索引訪問Python筆記索引
- 【廖雪峰python入門筆記】list_倒序訪問Python筆記
- 【廖雪峰python進階筆記】函數語言程式設計Python筆記函數程式設計
- 【廖雪峰python入門筆記】布林運算和短路計算Python筆記
- 【廖雪峰python入門筆記】list新增元素_append()和insert()Python筆記APP
- 【廖雪峰python入門筆記】Unicode編碼_UnicodeDecodeError處理Python筆記UnicodeError
- Git教程筆記 4.21Git筆記
- 跟著廖雪峰學python 005Python
- Python 爬蟲:把廖雪峰的教程轉換成 PDF 電子書Python爬蟲
- 廖雪峰JS學習總結-入門篇JS