git 使用

Pro Git 第二版中文, 网站
这个是一个非常好的学习网站
这里是一个DEMO网站

commit

使用 git commmit --amend 来提交一个平行的变更

标签

  • 查看标签 git tag
  • 附注标签
    git tag -a v1.4 -m 'my version 1.4'

  • 轻量标签
    $ git tag v1.4-lw

  • 后期打标签
    $ git tag -a v1.2 9fceb02

  • 推送标签

git push origin --tags

git push origin <tag>

合并

合并冲突时,使用 git status 查看,冲突文件中会有标记

可以使用合并工具高效处理 git mergetool

–merged 与 –no-merged 这两个有用的选项可以过滤这个列表中已经合并或尚未合并到当前分支的分支。 –merge 在这个列表中分支名字前没有 * 号的分支通常可以使用 git branch -d 删除掉;你已经将它们的工作整合到了另一个分支,所以并不会失去任何东西。

存储临时未提交的内容

当遇到需要临时存储的时候,使用git stash来进行存储

使用 git stash list 查看存储内容

使用 git stash pop 来恢复存储内容

cherry-pick

这个不同与base,可以单独将其他分支的一个提交放到本分支上来

git cherry-pick c3

变基

其实,还有一种方法:你可以提取在 C4 中引入的补丁和修改,然后在 C3 的基础上应用一次。 在 Git 中,这种操作就叫做 变基。 你可以使用 rebase 命令将提交到某一分支上的所有修改都移至另一分支上,就好像“重新播放”一样。

在需要使用交互方式的时候加上 -i 即可

注意变基时候的方向, 大多数情况使用 cherry-pick会更好

$ git rebase <目的分支> <将被移动的分支>

不要对在你的仓库外有副本的分支执行变基。

拉取

clone

  • 克隆一个项目到本地

git clone <url> --depth=1

这样就可以拉取最新的版本,不会有历史版本

当后面想拉取所有版本的时候,可以使用git fetch --unshallow

fetch

  • 拉取远端到本地新分支

git fetch origin master:<new_branch>

或者

git fetch <主仓地址> master:<new_branch>

pull

git pull 在大多数情况下它的含义是一个 git fetch 紧接着一个 git merge 命令

fork的仓库,拉取主仓内容

git pull <主仓地址> <branch>

例如:

git pull https://github.com/networktocode/ntc-templates.git master

也可以单独对某个commit进行拉取

退回与恢复

恢复的方法

重点在于列出所有的commit
git reflog

然后checkout到commit-id上就可以了

回退的两种方法

两种回退方式应该是resetrevert,其中reset是本地退后,本质是checkout,而revert的本质是将要退的地方提交一个新的commit。

  • git reset HEAD~
  • git revert HEAD
  • 使用reset回退
  • 使用checkout回退

reset

分为softhard 两种,soft只会回退状态,不会改变代码。hard回退会改变代码。默认是soft

git reset --hard [commit-id]

恢复即可找到之前的commit-id再reset

尽量不要使用--hard

checkout

使用checkout更加的安全方便
git checkout [commit-id] 将HEAD放到这个新的分支中, 再在这个分支中修改提交后。git checkout master 然后git merge [branch-id] 即可

或者直接使用 git branch -f [branch-id] <commit-id> 将这个分支指向这个commit

放弃跟踪文件

git rm -r --cache <file_path> 不删除本地文件

回退单个文件的方法

其实git loggit checkout 后面都可以带单个文件

所以是

  1. git log <file>来查看此文件的历史提交
  2. git checkout <hash> <file>来恢复特定版本

强制转移到另一个分支

git branch -f <master> <other_c>

.ignore 问题

对于track过的文件,后面的更改不想提交可以使用下面的方法

已经维护起来的文件,即使加上了gitignore,也无济于事。
用下面这个命令:
git update-index --assume-unchanged logs/*.log

这样每次提交就不会出现logs下面的文件了

关于远程的问题

当远端的历史发生变化,而自己这端提交新变更是提交不上的

解决办法是使用 git fetch 然后 git rebase orign/master 也就是将master基变到orgin/master上

简单的写法直接是git pull --rebase

远程push的同时可以创建分支

git push origin <branch>:<remoteNewBranch>

子模块

当我们需要拆分一个大项目,比如一个项目有很多个模块,每个模块都有自己的git仓库,那么我们可以使用git submodule add来添加模块

worktree

当需要频繁切换分支的时候,会遇到刚做了一点,但是不想提交的情况,那么可以使用git worktree add来创建一个worktree

worktree就是一个文件夹,这个文件夹与分支绑定在一起,进入了这个文件夹后,git的操作就会变成在这个文件夹中进行

  • 创建worktree
    git worktree add <worktree-name> <branch>

  • 切换到worktree
    cd <worktree-name>

  • 列出所有的worktree
    git worktree list

  • 删除worktree
    git worktree remove <worktree-name>


转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 365433079@qq.com