git
本文备忘几个常用的git命令,详细学习请转到廖雪峰的官方教程https://www.liaoxuefeng.com/wiki/0013739516305929606dd18361248578c67b8067c8c017b000
初始化一个Git仓库,使用git init命令。
添加文件到Git仓库,分两步:
- 使用命令
git add <file>
,注意,可反复多次使用,添加多个文件; - 使用命令
git commit -m <message>
,完成。
要随时掌握工作区的状态,使用git status
命令。
如果git status
告诉你有文件被修改过,用git diff
可以查看修改内容。
HEAD
指向的版本就是当前版本,因此,Git允许我们在版本的历史之间穿梭,使用命令git reset --hard commit_id
。
穿梭前,用git log
可以查看提交历史,以便确定要回退到哪个版本。
要重返未来,用git reflog
查看命令历史,以便确定要回到未来的哪个版本。
查看分支:git branch
创建分支:git branch <name>
切换分支:git checkout <name>
创建+切换分支:git checkout -b <name>
合并某分支到当前分支:git merge <name>
删除分支:git branch -d
1.创建版本库
创建一个目录(目录路径中不包含中文),进入目录并执行git init
把这个目录变成Git可以管理的仓库。
2.把文件添加到版本库
需要两步
- 执行
git add readme.txt
告诉Git,把文件readme.txt
添加到仓库 - 用命令
git commit -m "wrote a readme file"
告诉Git,把文件提交到仓库, -m “描述信息” - 可以先add多个文件,然后一起commit
$ git add file1.txt
$ git add file2.txt file3.txt
$ git commit -m "add 3 files."
3.修改版本库中文件后
1>运行git status
命令看看结果
$ 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 status命令可以让我们时刻掌握仓库当前的状态,上面的命令输出告诉我们,readme.txt被修改过了,但还没有准备提交的修改。
2>git diff
看具体修改了什么内容
$ 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.
//可以从上面的命令输出看到,我们在第一行添加了一个distributed单词
提交修改和提交新文件是一样的两步
//1.告诉Git,要提交修改的文件readme.txt
$ git add readme.txt
//2.看看当前仓库的状态,得到要被提交的修改包括readme.txt
$ git status
On branch master
Changes to be committed:
(use "git reset HEAD <file>..." to unstage)
modified: readme.txt
//3.提交
$ git commit -m "add distributed"
[master e475afc] add distributed
1 file changed, 1 insertion(+), 1 deletion(-)
//4.查看状态,Git告诉我们当前没有需要提交的修改,而且,工作目录是干净(working tree clean)的
$ git status
On branch master
nothing to commit, working tree clean
4.版本回退
1>用git log
命令查看历史记录
$ git log
commit 1094adb7b9b3807259d8cb349e7df1d4d6477073 (HEAD -> master) //commit id(版本号)
Author: Michael Liao <askxuefeng@gmail.com>
Date: Fri May 18 21:06:15 2018 +0800
append GPL
commit e475afc93c209a690c39c13a46716e8fa000c366
Author: Michael Liao <askxuefeng@gmail.com>
Date: Fri May 18 21:03:36 2018 +0800
add distributed
commit eaadf4e385e865d25c48e7ca9c8395c3f7dfaef0
Author: Michael Liao <askxuefeng@gmail.com>
Date: Fri May 18 20:59:18 2018 +0800
wrote a readme file
//git log命令显示从最近到最远的提交日志,我们可以看到3次提交,最近的一次是append GPL,上一次是add distributed,最早的一次是wrote a readme file。
如果嫌输出信息太多,看得眼花缭乱的,可以试试加上--pretty=oneline参数:
$ git log --pretty=oneline
1094adb7b9b3807259d8cb349e7df1d4d6477073 (HEAD -> master) append GPL
e475afc93c209a690c39c13a46716e8fa000c366 add distributed
eaadf4e385e865d25c48e7ca9c8395c3f7dfaef0 wrote a readme file
2>回退版本
现在我们准备把readme.txt回退到上一个版本
首先,Git必须知道当前版本是哪个版本,在Git中,用HEAD
表示当前版本,上一个版本就是HEAD^
,上上一个版本就是HEAD^^
,当然往上100个版本写100个^比较容易数不过来,所以写成HEAD~100
。
使用git reset
命令回退到上一个版本
$ git reset --hard HEAD^
HEAD is now at e475afc add distributed
注意,此时git log发现回退之后的版本不见了,想再回去已经回不去了,肿么办?
办法其实还是有的,只要上面的命令行窗口还没有被关掉,你就可以顺着往上找啊找啊,找到那个版本的commit id是1094adb…,于是就可以指定回到未来的某个版本:
$ git reset --hard 1094a
HEAD is now at 83b0afe append GPL
//版本号没必要写全,前几位就可以了,Git会自动去找。
现在,你回退到了某个版本,关掉了电脑,第二天早上就后悔了,想恢复到新版本怎么办?找不到新版本的commit id怎么办?
其实:Git的版本回退原理是,Git在内部有个指向当前版本的HEAD指针,当你回退版本的时候,Git仅仅是把HEAD指向改变了。
Git提供了一个命令git reflog
用来记录你的每一次命令
$ git reflog
e475afc HEAD@{1}: reset: moving to HEAD^
1094adb (HEAD -> master) HEAD@{2}: commit: append GPL
e475afc HEAD@{3}: commit: add distributed
eaadf4e HEAD@{4}: commit (initial): wrote a readme file
//commit id HEAD@{4}: git操作: 备注信息
5.撤销修改
命令git checkout -- file
工作区的修改全部撤销,让这个文件回到最近一次git commit
或git add
时的状态。$ git checkout -- readme.txt
这里有两种情况:
- 一种是readme.txt自修改后还没有被放到暂存区,现在,撤销修改就回到和版本库一模一样的状态;
- 一种是readme.txt已经添加到暂存区后,又作了修改,现在,撤销修改就回到添加到暂存区后的状态。
如果修改只是添加到了暂存区,还没有提交。用命令git reset HEAD <file>
可以把暂存区的修改撤销掉(unstage),重新放回工作区,然后再git checkout -- file
.
$ git reset HEAD readme.txt
Unstaged changes after reset:
M readme.txt
6.删除文件
1>文件管理器中删除,用命令git rm
删掉,并且git commit
先手动删除文件,然后使用git rm <file>
和git add<file>
效果是一样的。
2>删错了未commit时,因为版本库里还有呢,所以可以很轻松地把误删的文件恢复到最新版本:$ git checkout -- test.txt
7.关联一个远程库
先有本地库,后有远程库
要关联一个远程库,使用命令git remote add origin git@server-name:path/repo-name.git;
关联后,使用命令git push -u origin master
第一次推送master
分支的所有内容;
此后,每次本地提交后,只要有必要,就可以使用命令git push origin master
推送最新修改
先有远程库,后有本地库
用命令git clone
克隆一个本地库
$ 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), pack-reused 3
Receiving objects: 100% (3/3), done.
8.分支
首先,我们创建dev分支,然后切换到dev分支:
$ git checkout -b dev
Switched to a new branch 'dev'
git checkout
命令加上-b参数表示创建并切换,相当于以下两条命令:
$ git branch dev
$ git checkout dev
Switched to branch 'dev'
然后,用git branch命令查看当前分支:
$ git branch
* dev
master
dev分支的工作完成后,我们就可以切换回master分支:
$ git checkout master
Switched to branch 'master'
把dev分支的工作成果合并到master分支上,git merge
命令用于合并指定分支到当前分支。
$ git merge dev
Updating d46f35e..b17d20e
Fast-forward
readme.txt | 1 +
1 file changed, 1 insertion(+)
合并完成后,就可以放心地删除dev分支了:
$ git branch -d dev
Deleted branch dev (was b17d20e).
解释几个概念:
工作区(Working Directory): 就是你在电脑里能看到的目录
版本库(Repository): 工作区有一个隐藏目录.git
,这个不算工作区,而是Git的版本库。
Git的版本库里存了很多东西,其中最重要的就是称为stage(或者叫index)的暂存区,还有Git为我们自动创建的第一个分支master,以及指向master的一个指针叫HEAD。
前面讲了我们把文件往Git版本库里添加的时候,是分两步执行的:
- 第一步是用
git add
把文件添加进去,实际上就是把文件修改添加到暂存区; - 第二步是用
git commit
提交更改,实际上就是把暂存区的所有内容提交到当前分支。
你可以简单理解为,需要提交的文件修改通通放到暂存区,然后,一次性提交暂存区的所有修改。
未完,待续~~~~