欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

GIT

程序员文章站 2022-03-01 15:45:02
...

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 参数,循环删除掉目录下的所有文件,否则会报错