初始化一个Git仓库,使用 git init 命令。
添加文件到Git仓库,分两步:
- 使用命令 git add <file> ,注意,可反复多次使用,添加多个文件;
- 使用命令 git commit -m <message> ,完成。
$ git add file1.txt $ git add file2.txt file3.txt $ git commit -m "add 3 files."
git status 命令可以让我们时刻掌握仓库当前的状态,
如果 git status 告诉你有文件被修改过,用 git diff 可以查看修改内容。
版本回退(使用 git reset 命令):
git log 命令显示从最近到最远的提交日志
$ git log commit 243198cacee550cf478f4abf8b04eee9b5245f62 (HEAD -> master, origin/master) Author: eleven-123 <1782981957@qq.com> Date: Fri Feb 15 18:31:45 2019 +0800 edit readme.txt commit 1df583dc9ab58c0400080014a0d9d194eff91688 Author: eleven-123 <1782981957@qq.com> Date: Fri Feb 15 14:49:19 2019 +0800 add readme.txt commit df066b8f3529d2d910627ac8791f9232602efc4e Author: _vicky <30923911+eleven-123@users.noreply.github.com> Date: Fri Jan 4 10:44:16 2019 +0800 Initial commit
如果嫌输出信息太多,看得眼花缭乱的,可以试试加上 --pretty=oneline 参数:
$ git log --pretty=oneline
243198cacee550cf478f4abf8b04eee9b5245f62 (HEAD -> master, origin/master) edit readme.txt 1df583dc9ab58c0400080014a0d9d194eff91688 add readme.txt df066b8f3529d2d910627ac8791f9232602efc4e Initial commit
*注:243198...
的是commit id
(版本号)
在Git中,用HEAD
表示当前版本,也就是最新的提交 243198...
上一个版本就是 HEAD^ ,上上一个版本就是 HEAD^^ ,当然往上100个版本写 100个^ 比较容易数不过来,所以写成 HEAD~100 ,
例如:退回上个版本
$ git reset --hard HEAD^
或
$ git reset --hard HEAD~1
然后我们再用 git log 再看看现在版本库的状态:
$ git log commit 1df583dc9ab58c0400080014a0d9d194eff91688 (HEAD -> master) Author: eleven-123 <1782981957@qq.com> Date: Fri Feb 15 14:49:19 2019 +0800 add readme.txt commit df066b8f3529d2d910627ac8791f9232602efc4e Author: _vicky <30923911+eleven-123@users.noreply.github.com> Date: Fri Jan 4 10:44:16 2019 +0800 Initial commit
如果,又想回去到未回退之前状态呢???
第一种情况:上面的命令行窗口还未被关闭,找到你想指定的版本 commit id
$ git reset --hard 2431 HEAD is now at 243198c edit readme.txt
$ git log
commit 243198cacee550cf478f4abf8b04eee9b5245f62 (HEAD -> master, origin/master)
Author: eleven-123 <1782981957@qq.com>
Date: Fri Feb 15 18:31:45 2019 +0800
edit readme.txt
commit 1df583dc9ab58c0400080014a0d9d194eff91688
Author: eleven-123 <1782981957@qq.com>
Date: Fri Feb 15 14:49:19 2019 +0800
add readme.txt
commit df066b8f3529d2d910627ac8791f9232602efc4e
Author: _vicky <30923911+eleven-123@users.noreply.github.com>
Date: Fri Jan 4 10:44:16 2019 +0800
Initial commit
第二种情况:命令行窗口已被关闭:
Git提供了一个命令 git reflog 用来记录你的每一次命令:
$ git reflog 1df583d (HEAD -> master) HEAD@{0}: reset: moving to HEAD^ 243198c (origin/master) HEAD@{1}: reset: moving to 2431 1df583d (HEAD -> master) HEAD@{2}: reset: moving to HEAD~1 243198c (origin/master) HEAD@{3}: reset: moving to 2431 1df583d (HEAD -> master) HEAD@{4}: reset: moving to 1df5 df066b8 HEAD@{5}: reset: moving to HEAD~2 243198c (origin/master) HEAD@{6}: pull: Fast-forward 1df583d (HEAD -> master) HEAD@{7}: reset: moving to HEAD^ 243198c (origin/master) HEAD@{8}: pull: Fast-forward 1df583d (HEAD -> master) HEAD@{9}: reset: moving to HEAD^ 243198c (origin/master) HEAD@{10}: reset: moving to 2431 1df583d (HEAD -> master) HEAD@{11}: reset: moving to 1df5 df066b8 HEAD@{12}: reset: moving to HEAD^^ 243198c (origin/master) HEAD@{13}: reset: moving to 24319 1df583d (HEAD -> master) HEAD@{14}: reset: moving to HEAD^ 243198c (origin/master) HEAD@{15}: pull: Fast-forward 1df583d (HEAD -> master) HEAD@{16}: reset: moving to HEAD^ 243198c (origin/master) HEAD@{17}: reset: moving to HEAD 243198c (origin/master) HEAD@{18}: commit: edit readme.txt 1df583d (HEAD -> master) HEAD@{19}: commit: add readme.txt df066b8 HEAD@{20}: initial pull
$ git reset --hard 2431 HEAD is now at 243198c edit readme.txt $ git log --pretty=oneline 243198cacee550cf478f4abf8b04eee9b5245f62 (HEAD -> master, origin/master) edit readme.txt 1df583dc9ab58c0400080014a0d9d194eff91688 add readme.txt df066b8f3529d2d910627ac8791f9232602efc4e Initial commit
工作区与暂存区
Git和其他版本控制系统如SVN的一个不同之处就是有暂存区的概念。
工作区(Working Directory)
就是你在电脑里能看到的目录,比如我的 learngit 文件夹就是一个工作区:
版本库(Repository)
工作区有一个目录 .git ,这个不算工作区,而是Git的版本库。
Git的版本库里存了很多东西,其中最重要的就是称为stage(或者叫index)的暂存区,还有Git为我们自动创建的第一个分支 master ,以及指向 master 的一个指针叫 HEAD 。
我们把文件往Git版本库里添加的时候,是分两步执行的:
第一步: git add 把文件添加进去,实际上就是把文件修改添加到暂存区;
第二步: git commit 提交更改,实际上就是把暂存区的所有内容提交到当前分支。
因为我们创建Git版本库时,Git自动为我们创建了唯一一个 master 分支,所以 git commit 就是往 master 分支上提交更改。
你可以简单理解为,需要提交的文件修改通通放到暂存区,然后,一次性提交暂存区的所有修改。
撤销修改
- 当你改乱了工作区某个文件的内容,想直接丢弃工作区的修改时,用命令 git checkout -- file 。
- 当你不但改乱了工作区某个文件的内容,还添加到了暂存区时,想丢弃修改,① 用命令 git reset HEAD file ,file就回到了工作区,② 按1操作 git checkout -- file。
- 已经提交了不合适的修改到版本库时,想要撤销本次提交,可以版本回退,不过前提是没有推送到远程库。
删除文件
在Git中,删除也是一个修改操作
一般情况下,通常直接在文件管理器中把没用的文件删了,或者用rm
命令删了:
$ rm test.txt
这个时候,Git知道你删除了文件,因此,工作区和版本库就不一致了, git status 命令会立刻告诉你哪些文件被删除了:
$ git status On branch master Changes not staged for commit: (use "git add/rm <file>..." to update what will be committed) (use "git checkout -- <file>..." to discard changes in working directory) deleted: test.txt no changes added to commit (use "git add" and/or "git commit -a")
现在你有两个选择,一是确实要从版本库中删除该文件,那就用命令 git rm 删掉,并且 git commit :
$ git rm test.txt rm 'test.txt' $ git commit -m "remove test.txt" [master d46f35e] remove test.txt 1 file changed, 1 deletion(-) delete mode 100644 test.txt
另一种情况是删错了,因为版本库里还有呢,所以可以很轻松地把误删的文件恢复到最新版本:
$ git checkout -- test.txt
git checkout 其实是用版本库里的版本替换工作区的版本,无论工作区是修改还是删除,都可以“一键还原”。
注意:命令 git rm 用于删除一个文件。如果一个文件已经被提交到版本库,那么你永远不用担心误删,但是要小心,你只能恢复文件到最新版本,但你会丢失最近一次提交后你修改的内容
克隆
git clone 命令克隆
分支创建与合并
Git鼓励大量使用分支:
查看分支: git branch
创建分支: git branch <name>
切换分支: git checkout <name>
创建+切换分支: git checkout -b <name>
合并某分支到当前分支: git merge <name>
删除分支: git branch -d <name>
解决冲突
当Git无法自动合并分支时,就必须首先解决冲突。Git用 <<<<<<< , ======= , >>>>>>> 标记出不同分支的内容
解决冲突后,再提交,合并完成。
解决冲突就是把Git合并失败的文件手动编辑为我们希望的内容,再提交。
用 git log --graph 或 git log --graph --pretty=oneline 命令可以看到分支合并图。