你想要的git都有

git命令

在Mac上配置全局的Git忽略文件

vim ~/.gitignore_global
git config --global core.excludesfile ~/.gitignore_global
1
2

获取

这些在 shell 脚本中会很有用

  • 获取当前用户名:git config user.name
  • 获取当前分支: git symbolic-ref --short HEAD
  • git获取最近一次提交的commit id:git rev-parse HEAD
  • git获取tag最大值:'git describe --tags git rev-list --tags --max-count=1'
  • git获取所有tag(包括提交信息-n):git tag -l -n

正常提交

git add .
git commit -m "提交内容"
git pull
git push origin 分支名
1
2
3
4

初始化

设置用户名,邮箱

git config --global user.name "Author Name"
git config --global user.email "Author Email"
1
2

查看邮箱用户名等选项

gitc onfig --list
1

初始化一个Git仓库,使用git init命令。 第一步,使用命令git add .,添加全部 ,注意,可反复多次使用,添加多个文件; 第二步,使用命令git commit -m "提交的注释",完成。

运行git status命令看看结果 运行git diff这个命令可查看我们修改了什么内容 第一步:git add . 第二步:git commit -m "写改动的注释"

移仓库,同时保留原有的提交记录和分支

https://github.com/haizlin/fe-interview/issues/2150

git clone --bare 旧库地址
git push --mirror 新库地址
1
2

版本回退

通过git log来查看版本(加上--pretty=oneline参数查看关键信息): git中,用HEAD表示当前版本,上一个版本就是HEAD^,上上一个版本就是HEAD^^,当然往上100个版本写100个^比较容易数不过来,所以写成HEAD~100

HEAD指向的版本就是当前版本,因此,Git允许我们在版本的历史之间穿梭,使用命令git reset --hard commit_id。 穿梭前,用git log可以查看提交历史,以便确定要回退到哪个版本。 要重返未来,用git reflog查看命令历史,以便确定要回到未来的哪个版本。

删除之前的提交记录

找到提交的commit_id , 先git checkout <commit_id>,然后git push origin <commit_id> --force,这个要慎重,删除了就没有了。

工作区和暂存区

前面讲了我们把文件往Git版本库里添加的时候,是分两步执行的: 第一步是用git add把文件添加进去,实际上就是把文件修改添加到暂存区; 第二步是用git commit提交更改,实际上就是把暂存区的所有内容提交到当前分支。

撤销修改

git reflog 记录每一次操作,可进行回滚git 优雅的撤销中间某次提交?https://blog.csdn.net/u013066244/article/details/79920012在新窗口打开

有时候我们希望只合并某个分支上的某次修改commit到指定的分支上.那么就可以使用cherry-pick命令来操作了.

使用git log 查看提交的信息,记住commit id.

git checkout 要修改的分支

git cherry-pick 某个commit id // 把某个commit id的提交合并到当前分支.

在修改了文件之后,且还没有add之前,可执行以下命令丢弃工作区的修改。

$ git checkout –- readme.txt
1

git checkout -- file命令中的--很重要,没有--,就变成了“切换到另一个分支”的命令,我们在后面的分支管理中会再次遇到git checkout命令

如果你想要修改,已经git add到暂存区,但还没有commit的内容。 我们可以用命令git reset HEAD file可以把暂存区的修改撤销掉(unstage),重新放回工作区:

$ git reset HEAD readme.txt
1

git reset命令既可以回退版本,也可以把暂存区的修改回退到工作区。当我们用HEAD时,表示最新的版本。

丢弃文件命令

  • git checkout . # 丢弃所有修改或删除,不影响新增或未跟踪的文件。会递归下级目录
  • git clean -nxdf # dry-run,先看下即将删除那些文件,再执行下面的危险命令
  • git clean -df # 删除所有未跟踪的文件和目录(不包含.gitignore的文件),危险命令
  • git clean -xdf # 删除所有未跟踪的文件和目录(同时包含.gitignore的文件),危险命令

将当前提交撤回到commitB_hash

git reset –-hard commitB_hash
1

将工作区,暂存区强制恢复成 commitB_hash的状态

git reset  commitB_hash
1

Git的4个阶段的撤销更改在新窗口打开

git stash用法

保存当前修改

git stash 会把所有未提交的修改(包括暂存的和非暂存的)都保存起来,用于后续恢复当前工作目录。stash 是本地的,不会通过 git push 命令上传到 git server 上。

重新应用缓存的stash

可以通过 git stash pop 命令恢复之前缓存的工作目录,这个指令将缓存堆栈中的第一个stash删除,并将对应修改应用到当前的工作目录下

或者 git stash apply {stashID}

查看现有stash

可以使用 git stash list 命令, 点击查看更多stash用法在新窗口打开

恢复 stash

使用 git stash clear 误删除找回

git log --graph --oneline --decorate $( git fsck --no-reflog | awk '/dangling commit/ {print $3}') 调出 stashlog,该 log 对应 stash 的栈缓存纪录,WIPmidify 内容,indexadd 内容,所以,一般情况下,WIPindex 内容要全

然后执行 git stash apply {id} 恢复最后 stash 的内容 至此,stash 被删除的内容全部被找回

删除文件

一般情况下,你通常直接在文件管理器中把没用的文件删了,或者用rm命令删了:

$ rm test.txt
1

这个时候,Git知道你删除了文件,因此,工作区和版本库就不一致了,git status命令会立刻告诉你哪些文件被删除了: 现在你有两个选择,一是确实要从版本库中删除该文件,那就用命令git rm删掉,并且git commit

另一种情况是删错了,因为版本库里还有呢,所以可以很轻松地把误删的文件恢复到最新版本:

$ git checkout -- test.txt
1

git checkout其实是用版本库里的版本替换工作区的版本,无论工作区是修改还是删除,都可以“一键还原”。

分支管理

git查看当前分支所属

git branch -vv
1

创建与合并分支 首先创建dev分支,然后切换到dev分支

$ git checkout –b dev
git checkout - (-代表上一个分支名,这里是简写)
Switched to a new branch 'dev'
1
2
3

git checkout命令加上-b参数表示创建并切换,相当于以下两条命令:

$ git branch dev
$ git checkout dev
Switched to branch 'dev'
1
2
3

git branch –a 查看当前仓库的所有分支;git branch –r查看远程仓库的所有分支

dev分支的工作成果合并到master分支上:

$ git merge dev
1

修改分支

如果对于分支不是当前分支,可以使用下面代码:

 git branch -m 原名 新
1

如果是当前,那么可以使用加上新名字

git branch -m 原名
1

混乱的分支

报错$ git checkout -b *** fatal: cannot lock ref 'refs/heads/***': 'refs/heads/***' exists; cannot create 'refs/heads/user/***'

git remote prune origin
1

Git创建一个空分支

git checkout --orphan emptyBranchName
git rm -rf .
1
2

git提交空文件夹

创建 .gitkeep 文件,内容如下

# Ignore everything in this directory
*
# Except this file !.gitkeep
1
2
3

小结

  • 查看分支:git branch

  • 创建分支:git branch

  • 切换分支:git checkout

  • 创建 切换分支:git checkout -b

  • 合并某分支到当前分支:git merge

  • 删除本地分支:git branch -D 分支名

  • 删除远程分支: git push origin --delete 分支名

  • 提交:git branch origin 远程分支名称

自定义Git

配置命令别名 本节是教你如何偷懒的。 如果敲git st就表示git status那就简单多了,当然这种偷懒的办法我们是极力赞成的。 我们只需要敲一行命令,告诉Git,以后st就表示status

git config --global alias.st status
git config --global alias.pl pull
git config --global alias.ps push
git config --global alias.ci commit
git config --global alias.co checkout
git config --global alias.br branch
git config --global alias.cp cherry-pick
git config --global alias.ss stash
1
2
3
4
5
6
7
8

当然还有别的命令可以简写,很多人都用co表示checkoutci表示commitbr表示branch

其它技巧

之前上传过的文件夹已经提交过了,新加的 .ignore不起作用, 想要忽略怎么办?执行这个,然后正常提交ok git rm -r --cached .

查看某一段代码谁写的 git blame file.js -L 1,2

安全重命名

git mv <old-name> <new-name>

并入你最近的一次 commit

git commit --amend --no-edit

这条命令会把你暂存的修改并入你最近的一次 commit,并且不会修改这次 commit 的信息( 这样 Git 也就不会打开一个文件编辑界面了。 它最经常的用途是修改刚刚提交的 commit。也许我太粗心了, 总是在刚提交完一条 commit 还不到 30 秒,就发现一个拼写错误或者忘了删除了调式信息了

撤销远程操作

已经提交到远程了,不想要了,怎么办?

git reset --hard [commit_id]
git push origin [分支名]
1
2

这个操作非常危险,如果别人也提交了,他的也会不存在

git 子模块

克隆所有子模块

git clone --recursive git://github.com/foo/bar.git
1

如果已经克隆了

git submodule update --init --recursive
1

添加

为当前工程添加submodule,命令如下

git submodule add 仓库地址 路径
1

其中,仓库地址是指子模块仓库地址,路径指将子模块放置在当前工程下的路径。 注意:路径不能以 / 结尾(会造成修改不生效)、不能是现有工程已有的目录(不能順利 Clone),不写路径默认当前文件夹

命令执行完成,会在当前工程根路径下生成一个名为“.gitmodules”的文件,其中记录了子模块的信息。添加完成以后,再将子模块所在的文件夹添加到工程中即可。

删除

submodule的删除稍微麻烦点:首先,要在“.gitmodules”文件中删除相应配置信息。然后,执行“git rm –cached ”命令将子模块所在的文件从git中删除。

下载的工程带有submodule

当使用git clone下来的工程中带有submodule时,初始的时候,submodule的内容并不会自动下载下来的,此时,只需执行如下命令:

git submodule update --init --recursive
1

即可将子模块内容下载下来后工程才不会缺少相应的文件。

修改子模块并提交

进入子模块目录下,进行git add . ,git commit -m "",git push origin origin操作 最后在主模块提交

添加ssh

git 钩子

pre-commit 钩子在键入提交信息前运行。 它用于检查即将提交的快照,例如,检查是否有所遗漏,确保测试运行,以及核查代码。 如果该钩子以非零值退出,Git 将放弃此次提交,不过你可以用 git commit --no-verify 来绕过这个环节。 你可以利用该钩子,来检查代码风格是否一致(运行类似 lint 的程序)、尾随空白字符是否存在(自带的钩子就是这么做的),或新方法的文档是否适当。

"pre-commit": [
    "lint"
  ],
  "scripts": {
    "lint": "eslint --ext .js, src",
    "lint:fix": "npm run lint -- --fix"
  },
1
2
3
4
5
6
7

git提交前会验证lint命令

更多查看https://github.com/k88hudson/git-flight-rules/blob/master/README_zh-CN.md在新窗口打开

在线学习git使用 https://learngitbranching.js.org/在新窗口打开

今日图

16a8d22958e71066.png