GIT
GIT 查看config配置信息
- 查看系统config
git config --system --list
- 查看当前用户配置信息
git config --global --list
- 查看当前仓库配置信息
git config --local --list
- 创建一个本地分支,并关联对应的远程分支
git checkout --track branchname
--- example
git checkout --track origin/dev_wcc
- 清理workspace中未被git版本控制的文件,比如临时文件,构建出来的二进制文件。
git clean
-n 并不实际执行删除操作,只显示出将被清理的文件列表
-X 仅删除.gitignore里标记过的文件,那些既不被git版本控制,又不在.gitignore中的文件会被保留。
-d 参数表示连同目录一起删除
-f 删除文件
- 查看某个文件的修改历史
git log -- filename
git log filename
- 将某个文件回滚到指定版本
- 1查找文件的提交历史记录
git log --filename
- 2 回滚
- 2.1
- 第一种回滚方式
--- 利用 hash 回滚特定文件
git checkout 提交hash值 filename
- 第二种回滚方式
git reset 提交hash值 filename
- 2.2
--- 回滚后需要提交
git commit -am '回滚fileanme'
- 解决冲突时,如果某些文件想直接使用对方的分支(即当前分支要merge的分支)的。
git checkout --theirs filename
- 解决冲突时,如果某些文件想直接使用当前分支的。
git checkout --ours filename
- git diff命令
- 工作目录 vs 暂存区
git diff <filename>
---查看文件在工作目录与暂存区的差别。如果还没 add 进暂存区,则查看文件自身修改前后的差别。也可查看和另一分支的区别。
git diff <branch> <filename>
- 暂存区 vs Git仓库
git diff --cached <filename>
--- 意义:表示查看已经 add 进暂存区但是尚未 commit 的内容同最新一次 commit 时的内容的差异。 也可以指定仓库版本:
git diff --cached <commit> <filename>
- 工作目录 vs Git仓库
git diff <commit> <filename>
意义:查看工作目录同Git仓库指定 commit 的内容的差异。
<commit>=HEAD 时:查看工作目录同最近一次 commit 的内容的差异。
-- Git仓库 vs Git仓库
git diff <commit> <commit>
- 使用git status命令就可以看到你本次修改(新增、删除、修改)中涉及到哪些文件,同时也可以看到已经存入暂存区中发生修改变更的文件,便于检查具体修改了哪些文件,以免出现疏漏。
- git commit
git commit -m用于提交暂存区的文件;git commit -am用于提交跟踪过的文件
所以在使用git commit -am
命令时,是不会把untracked file(从未加入到缓存区中的文件,也可以理解为新增的文件)提交到版本库中的,这一点一定要注意。
- git add
git add . :他会监控工作区的状态树,使用它会把工作时的所有变化提交到暂存区,包括文件内容修改(modified)以及新文件(new),但不包括被删除的文件。
git add -u :他仅监控已经被add的文件(即tracked file),他会将被修改的文件提交到暂存区。add -u 不会提交新文件(untracked file)。(git add --update的缩写)
git add -A :是上面两个功能的合集(git add --all的缩写)
所以在我们日常开发中,提交代码时。可以使用
--- 直接把所有的修改(增,删,改)加入到缓存区
git add -A
--- 提交缓存区中的文件
git commit -m '提交信息'
或者
-- 将untracked file加入到缓存区了,但是不包括被删除文件
git add .
-- 将git add .不会提交的已删除文件 添加到了缓存区中,并且提交所有的修改(增,删,改)
git commit -am '提交信息'
git reset
除了在当前分支上操作,你还可以通过传入这些标记来修改你的缓存区或工作目录:
- –soft – 缓存区和工作目录都不会被改变
- –mixed – 默认选项。缓存区和你指定的提交同步,但工作目录不受影响
- –hard – 缓存区和工作目录都同步到你指定的提交
Git 工作区、暂存区和版本库
- 工作区:就是你在电脑里能看到的目录。
- 暂存区:英文叫stage, 或index。一般存放在 “.git目录下” 下的index文件(.git/index)中,所以我们把暂存区有时也叫作索引(index)。
- 版本库:工作区有一个隐藏目录.git,这个不算工作区,而是Git的版本库。
Git的版本库里存了很多东西,其中最重要的就是称为stage(或者叫index)的暂存区,还有Git为我们自动创建的第一个分支master,以及指向master的一个指针叫HEAD。
git 撤销修改
git reset、git checkout 和 git revert 是你的 Git 工具箱中最有用的一些命令。它们都用来撤销代码仓库中的某些更改,而前两个命令不仅可以作用于提交,还可以作用于特定文件。
提交层面
- git reset
在提交层面上,reset 将一个分支的末端指向另一个提交。这可以用来移除当前分支的一些提交。比如,下面这两条命令让 hotfix 分支向后回退了两个提交。hotfix 分支末端的两个提交现在变成了悬挂提交。也就是说,下次 Git 执行垃圾回收的时候,这两个提交会被删除。换句话说,如果你想扔掉这两个提交,你可以这么做。
git reset --mixed HEAD 将你当前的改动从缓存区中移除,但是这些改动还留在工作目录中。另一方面,如果你想完全舍弃你没有提交(git push)的改动,你可以使用 git reset --hard HEAD。这是 git reset 最常用的两种用法。
当你传入 HEAD 以外的其他提交的时候要格外小心,因为 reset 操作会重写当前分支的历史。正如 rebase 黄金法则所说的,在公共分支上这样做可能会引起严重的后果。
git reset 会直接丢弃到被回退的提交
- git checkout
git checkout hotfix
上面这个命令做的不过是将HEAD移到一个新的分支,然后更新工作目录。因为这可能会覆盖本地的修改,Git 强制你提交或者缓存工作目录中的所有更改,不然在 checkout 的时候这些更改都会丢失。和 git reset 不一样的是,git checkout 没有移动这些分支。
- git revert
Revert 撤销一个提交的同时会创建一个新的提交。这是一个安全的方法,因为它不会重写提交历史。比如,下面的命令会找出倒数第二个提交,然后创建一个新的提交来撤销这些更改,然后把这个提交加入项目中。
相比 git reset,它不会改变现在的提交历史。因此,git revert 可以用在公共分支上,git reset 应该用在私有分支上。
你也可以把 git revert 当作撤销已经提交(git push)的更改,而 git reset HEAD 用来撤销没有提交(git push)的更改。
就像 git checkout 一样,git revert 也有可能会重写文件。所以,Git 会在你执行 revert 之前要求你提交或者缓存你工作目录中的更改。
git revert 并不会丢弃掉被回退的提交,而是向前创建一个新的提交(这个提交就得内容就是撤销回退的更改),所以使用git revert是可以在公共分支的,因为我们可以在git log里面依旧能找到那些被回退的提交。
文件层面的操作
git reset 和 git checkout 命令也接受文件路径作为参数。这时它的行为就大为不同了。它不会作用于整份提交,参数将它限制于特定文件。
- git reset
当检测到文件路径时,git reset 将缓存区同步到你指定的那个提交。比如,下面这个命令会将倒数第二个提交中的 foo.py 加入到缓存区中,供下一个提交使用。
git reset HEAD~2 foo.py
和提交层面的 git reset 一样,通常我们使用HEAD而不是某个特定的提交。运行 git reset HEAD foo.py 会将当前的 foo.py 从缓存区中移除出去,而不会影响工作目录中对 foo.py 的更改。
- git checkout
Checkout 一个文件和带文件路径 git reset 非常像,除了它更改的是工作目录而不是缓存区。不像提交层面的 checkout 命令,它不会移动 HEAD引用,也就是你不会切换到别的分支上去。
命令 | 作用域 | 常用情景 |
---|---|---|
git reset | 提交层面 | 在私有分支上舍弃一些没有提交的更改 |
git reset | 文件层面 | 将文件从缓存区中移除 |
git checkout | 提交层面 | 切换分支或查看旧版本 |
git checkout | 文件层面 | 舍弃工作目录中的更改 |
git revert | 提交层面 | 在公共分支上回滚更改 |
git revert | 文件层面 | (然而并没有) |
场景1:当你改乱了工作区某个文件的内容,想直接丢弃工作区的修改时,用命令git checkout – file。
场景2:当你不但改乱了工作区某个文件的内容,还添加到了暂存区时,想丢弃修改,分两步,第一步用命令git reset HEAD file,就回到了场景1,第二步按场景1操作。
- git stash
New versions of git now have git stash --all which stashes all files, including untracked and ignored files.
git stash --include-untracked no longer touches ignored files (tested on git 2.16.2).
git stash --all
git stash --include-untracked
- git pull
git pull =git fetch+ git merge
- git tag
2、每次上线确保通过之后master分支记得打tag
命令:git tag “tag name”
git push origin --tags
取消追踪已追踪文件
有时候我们会把一些本不需要追踪的文件提交到 GIT仓库中(例如一开始并没有指定好gitignore文件),那么我们怎么取消追踪这些本不需要追踪的文件呢?
使用git rm --cached
命令
这个命令就是移除掉暂存区和版本库中的文件(目录),不会影响工作区间,这些文件我们在工作区间还是需要使用的。
用删除文件,则使用
git rm --cached fliename
如果要删除目录及目录下的所有文件
git rm -r --cached directoryname
要加上-r 参数,循环删除掉目录下的所有文件,否则会报错