Git 笔记

  • 初始化一个Git仓库,使用 git init 命令。
  • 添加文件到Git仓库,分两步:
  1. 使用命令 git add <file> ,注意,可反复多次使用,添加多个文件;
  2. 使用命令 git commit -m <message> ,完成。
$ git add file1.txt
$ git add file2.txt file3.txt
$ git add ./
$ git commit -m "add 3 files."
$ git commit -a -m "add 3 files."


//说明
git add ./ ---添加所有修改
git commit -a -m "add msg..." ---添加并提交

 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 分支上提交更改。

你可以简单理解为,需要提交的文件修改通通放到暂存区,然后,一次性提交暂存区的所有修改。

 

撤销修改

  1. 当你改乱了工作区某个文件的内容,想直接丢弃工作区的修改时,用命令 git checkout -- file 。
  2. 当你不但改乱了工作区某个文件的内容,还添加到了暂存区时,想丢弃修改,① 用命令 git reset HEAD file ,file就回到了工作区,② 按1操作 git checkout -- file
  3. 已经提交了不合适的修改到版本库时,想要撤销本次提交,可以版本回退,不过前提是没有推送到远程库。

 

删除文件

在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 命令可以看到分支合并图。

 

posted @ 2019-02-27 13:52  十一是假期啊  阅读(150)  评论(0编辑  收藏  举报