0%

Git2

##git
最基本的操作就是
gst ->git add . ->git commit -m"" ->git push ->gst
但是往往事情没有那么顺利,比如git add以后我要撤销怎么办

具体修改了什么代码

git diff —>比较的是工作目录中当前文件和暂存区域快照之间的差异
git diff –staged —>比较已经暂存起来的文件和上次提交时的快照之间的差异

git commit -a -m “”—>其中-a是add .的作用

git log -p -2 —>-p是展开每个版本的不同点,-2是最近2次

git checkout主要有三个作用:

  • 第一个就是切换分支。例如你从远程仓库clone下来所有的源代码,你git branch一下会看到你通常是在master,如果你想切换到某一个分支上呢?git checkout
  • 第二个就是放弃对某个文件的修改。例如你想放弃对某个文件Hello.cpp的修改,git checkout – <Hello.cpp>//回到上个版本
  • 第三个就是新建一个分支,git checkout <-b> ,不加-b的话只新建不切换到新的分支上,加-b新建并切换到该分支上

    git reset主要是取消上一次的操作,具体用法有很多:

  • 第一个取消merge,git reset –hard ORIG_HEAD,这样会退回到merge前的代码。
  • 第二个是将文件从stage(缓存区)中移除,git reset HEAD
    忽略某些文件
  • 第三个就是取消commit,git reset HEAD~ <-soft/-hard>,取消上num次的commit .将你当前的改动从缓存区中移除,但是这些改动还留在工作目录中git reset --mixed HEAD 如果你想完全舍弃你没有提交的改动,你可以使用 git reset --hard HEAD

    git revert 撤销一个提交的同时会创建一个新的提交

    你也可以把 git revert 当作撤销已经提交的更改,而 git reset HEAD 用来撤销没有提交的更改。
    [image:72F89E7D-B0C1-47A0-B2CC-1762EB05968A-26007-00004B3EC747D25B/BEAF033D-F9E6-4393-B4C6-0BF330F0AB4A.png]

远程仓库git remote

  • git fetch [remote-name]:此命令会到远程仓库中拉取所有你本地仓库中还没有的数据。不像git pull 只是把当前分支的代码拉下来,而是拉整个仓库的数据。运行完成后,你就可以在本地访问该远程仓库中的所有分支,将其中某个分支合并到本地,或者只是取出某个分支,一探究竟。
  • 实际上,默认情况下 git clone 命令本质上就是自动创建了本地的 master 分支用于跟踪远程仓库中的 master 分支(假设远程仓库确实有 master 分支)。所以一般我们运行 git pull,目的都是要从原始克隆的远端仓库中抓取数据后,合并到工作目录中的当前分支。
  • git push [origin master]:把本地缓存区的代码推送的远程仓库.
  • 查看远程仓库信息git remote show [remote-name]:除了对应的克隆地址外,它还给出了许多额外的信息。它友善地告诉你如果是在 master 分支,就可以用 git pull 命令抓取数据合并到本地。另外还列出了所有处于跟踪状态中的远端分支。

    打标签git tag

  • 不含标注用 -l 含标注用- a -m后面带注释.

    查看相应标签的版本信息git show

    代码合并

    merge和 rebase 所做的事其实是一样的,都是把两个分支合并,不过rebase 是变基而 merge 是真正的合并,这对后期查看分支有一定的影响.

所以,在你运行 git rebase 之前,一定要问问你自己「有没有别人正在这个分支上工作?」。如果答案是肯定的,那么把你的爪子放回去,重新找到一个无害的方式(如 git revert)来提交你的更改。不然的话,你可以随心所欲地重写历史。

当你理解 rebase 是什么的时候,最重要的就是什么时候 不能 用 rebase。git rebase 的黄金法则便是,绝不要在公共的分支上使用它。

忽略一些文件

一般我们总会有些文件无需纳入 Git 的管理,也不希望它们总出现在未跟踪文件列表。通常都是些自动生成的文件,比如日志文件,或者编译过程中创建的临时文件等。我们可以创建一个名为 .gitignore 的文件,列出要忽略的文件模式。来看一个实际的例子:

我们可以创建一个名为 .gitignore 的文件,列出要忽略的文件模式。来看一个实际的例子:

1
2
3
4
$ cat .gitignore
*.[oa]
*~
\

第一行告诉 Git 忽略所有以 .o 或 .a 结尾的文件。一般这类对象文件和存档文件都是编译过程中出现的,我们用不着跟踪它们的版本。第二行告诉 Git 忽略所有以波浪符(~)结尾的文件,许多文本编辑软件(比如 Emacs)都用这样的文件名保存副本。此外,你可能还需要忽略 log,tmp 或者 pid 目录,以及自动生成的文档等等。要养成一开始就设置好 .gitignore 文件的习惯,以免将来误提交这类无用的文件。

文件 .gitignore 的格式规范如下:

所有空行或者以注释符号 # 开头的行都会被 Git 忽略。
可以使用标准的 glob 模式匹配。
匹配模式最后跟反斜杠(/)说明要忽略的是目录。
要忽略指定模式以外的文件或目录,可以在模式前加上惊叹号(!)取反。
所谓的 glob 模式是指 shell 所使用的简化了的正则表达式。星号(*)匹配零个或多个任意字符;[abc] 匹配任何一个列在方括号中的字符(这个例子要么匹配一个 a,要么匹配一个 b,要么匹配一个 c);问号(?)只匹配一个任意字符;如果在方括号中使用短划线分隔两个字符,表示所有在这两个字符范围内的都可以匹配(比如 [0-9] 表示匹配所有 0 到 9 的数字)。

我们再看一个 .gitignore 文件的例子:

1
2
3
4
5
6
7
8
9
10
11
12
13
# 此为注释 – 将被 Git 忽略
# 忽略所有 .a 结尾的文件
*.a
# 但 lib.a 除外
!lib.a
# 仅仅忽略项目根目录下的 TODO 文件,不包括 subdir/TODO
/TODO
# 忽略 build/ 目录下的所有文件
build/
# 会忽略 doc/notes.txt 但不包括 doc/server/arch.txt
doc/*.txt
# ignore all .txt files in the doc/ directory
doc/**/*.txt