赞
踩
原文链接: https://juejin.cn/post/6844904191203213326
Workspace
:工作区Index / Stage
:暂存区Repository
:仓库区(或本地仓库)Remote
:远程仓库# 配置全局用户
$ git config --global user.name "用户名"
$ git config --global user.email "git账号"
# 配置别名
$ git config --global alias.co checkout
$ git config --global alias.ss status
$ git config --global alias.cm commit
$ git config --global alias.br branch
$ git config --global alias.rg reflog
# 这里只是美化 log 的输出,实际使用时可以在 git lg 后面加命令参数,如: git lg -10 显示最近10条提交
$ git config --global alias.lg "log --color --graph --pretty=format:'%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr) %C(bold blue)<%an>%Creset' --abbrev-commit"
# 删除全局配置
$ git config --global --unset alias.xxx
$ git config --global --unset user.xxx
复制代码
# 查看系统配置
$ git config --list
# 查看用户配置
$ cat ~/.gitconfig
# 查看当前项目的 git 配置
$ cat .git/config
# 查看暂存区的文件
$ git ls-files
# 查看本地 git 命令历史
$ git reflog
# 查看所有 git 命令
$ git --help -a
# 查看当前 HEAD 指向
$ cat .git/HEAD
$ git log --oneline
–grep=“关键字”
–graph
–all
–author “username”
–reverse
-num
-p
–before= 1 day/1 week/1 “2019-06-06”
–after= “2019-06-06”
–stat
–abbrev-commit
–pretty=format:“xxx”
复制代码
HEAD
指向发生改变的时间列表。在你切换分支、用 git commit
进行提交、以及用 git reset
撤销 commit 时,HEAD
指向会改变,但当你进行 git checkout -- <filename>
撤销或者 git stash
存储文件等操作时,HEAD
并不会改变,这些修改从来没有被提交过,因此 reflog
也无法帮助我们恢复它们。git reflog
不会永远保持,Git 会定期清理那些 “用不到的” 对象,不要指望几个月前的提交还一直在那里。符号解释:
* 表示一个 commit
| 表示分支前进
/ 表示分叉
\ 表示合入
|/ 表示新分支
复制代码
# 查看工作区和暂存区的状态 $ git status # 将工作区的文件提交到暂存区 $ git add . # 提交到本地仓库 $ git commit -m "本次提交说明" # add和commit的合并,便捷写法(未追踪的文件无法直接提交到暂存区/本地仓库) $ git commit -am "本次提交说明" # 将本地分支和远程分支进行关联 $ git push -u origin branchName # 将本地仓库的文件推送到远程分支 $ git push # 拉取远程分支的代码 $ git pull origin branchName # 合并分支 $ git merge branchName # 查看本地拥有哪些分支 $ git branch # 查看所有分支(包括远程分支和本地分支) $ git branch -a # 切换分支 $ git checkout branchName # 临时将工作区文件的修改保存至堆栈中 $ git stash # 将之前保存至堆栈中的文件取出来 $ git stash pop 复制代码
将工作区的文件添加到暂存区
# 添加指定文件到暂存区(追踪新增的指定文件)
$ git add [file1] [file2] ...
# 添加指定目录到暂存区,包括子目录
$ git add [dir]
# 添加当前目录的所有文件到暂存区(追踪所有新增的文件)
$ git add .
# 删除工作区/暂存区的文件
$ git rm [file1] [file2] ...
# 停止追踪指定文件,但该文件会保留在工作区
$ git rm --cached [file]
# 改名工作区/暂存区的文件
$ git mv [file-original] [file-renamed]
#只作用于文件的新增和修改
$ git add .
#只作用于文件的修改和删除
$ gti add -u
#作用于文件的增删改
$ git add -A
$ git add . 等价于 $ git add -A
复制代码
git add .
:操作的对象是“当前目录”所有文件变更,"." 表示当前目录。会监控工作区的状态树,使用它会把工作区的所有变化提交到暂存区,包括文件内容修改(modified
)以及新文件(new
),但不包括被删除的文件。git add -u
:操作的对象是整个工作区已经跟踪的文件变更,无论当前位于哪个目录下。仅监控已经被 add 的文件(即 tracked file
),它会将被修改的文件(包括文件删除)提交到暂存区。git add -u
不会提交新文件(untracked file
)。(git add --update
的缩写)git add -A
:操作的对象是“整个工作区”所有文件的变更,无论当前位于哪个目录下。是上面两个功能的合集(git add --all
的缩写)。# 查看工作区和暂存区的状态
$ git status
复制代码
# 将暂存区的文件提交到本地仓库并添加提交说明
$ git commit -m "本次提交的说明"
$ git commit -am “本次提交的说明”
$ git commit --no-verify
$ git commit -n
$ git commit --amend
$ git commit --amend -m “本次提交的说明”
$ git commit --amend --no-edit
复制代码
git commit --amend
既可以修改上次提交的文件内容,也可以修改上次提交的说明。会用一个新的 commit
更新并替换最近一次提交的 commit
。如果暂存区有内容,这个新的 commit
会把任何修改内容和上一个 commit
的内容结合起来。如果暂存区没有内容,那么这个操作就只会把上次的 commit
消息重写一遍。永远不要修复一个已经推送到公共仓库中的提交,会拒绝推送到仓库# 将本地仓库的文件推送到远程分支
# 如果远程仓库没有这个分支,会新建一个同名的远程分支
# 如果省略远程分支名,则表示两者同名
$ git push <远程主机名> <本地分支名>:<远程分支名>
$ git push origin branchname
$ git push origin :master
$ git push origin --delete master
$ git push -u origin master
$ git push
$ git push --all origin
$ git pull
$ git pull origin branchname
$ git fetch origin branchName
$ git merge origin/branchName
$ git push --force origin | git push -f origin
复制代码
# 查看本地分支
$ git branch | git branch -l
# 查看远程分支
$ git branch -r
# 查看所有分支(本地分支+远程分支)
$ git branch -a
# 查看所有分支并带上最新的提交信息
$ git branch -av
# 查看本地分支对应的远程分支
$ git branch -vv
$ git branch branchname
$ git checkout branchname
$ git checkout -b aaa
$ git checkout -b aaa master
$ git checkout --orphan emptyBranchName
$ git rm -rf .
$ git brnach -d branchname
$ git branch -D branchname
$ git push origin :远程分支名
$ git push origin --delete 远程分支名
$ git branch -m branchname
复制代码
# 默认 fast-forward ,HEAD 指针直接指向被合并的分支
$ git merge
$ git merge --no-ff
$ git merge --squash
复制代码
fast-forward
:会在当前分支的提交历史中添加进被合并分支的提交历史(得先理解什么时候会发生快速合并,并不是每次 merge 都会发生快速合并);--no-ff
:会生成一个新的提交,让当前分支的提交历史不会那么乱;--squash
:不会生成新的提交,会将被合并分支多次提交的内容直接存到工作区和暂存区,由开发者手动去提交,这样当前分支最终只会多出一条提交记录,不会掺杂被合并分支的提交历史www.liaoxuefeng.com/wiki/896043…
No local changes to save
,无法将修改保存到堆栈中使用场景: 当你接到一个修复紧急 bug 的任务时候,一般都是先创建一个新的 bug 分支来修复它,然后合并,最后删除。但是,如果当前你正在开发功能中,短时间还无法完成,无法直接提交到仓库,这时候可以先把当前工作区的内容 git stash
一下,然后去修复 bug,修复后,再 git stash pop
,恢复之前的工作内容。
# 将所有未提交的修改(提交到暂存区)保存至堆栈中
$ git stash
# 给本次存储加个备注,以防时间久了忘了
$ git stash save "存储"
# 存储未追踪的文件
$ git stash -u
$ git stash list
在 Windows 上和 PowerShell 中,需要加双引号
$ git stash apply “stash@{index}”
$ git stash pop “stash@{index}”
$ git stash drop “stash@{index}”
$ git stash clear
$ git stash show “stash@{index}”
$ git stash show -p “stash@{index}”
复制代码
# 查看工作区和暂存区单个文件的对比
$ git diff filename
# 查看工作区和暂存区所有文件的对比
$ git diff
# 查看工作区和暂存区所有文件的对比,并显示出所有有差异的文件列表
$ git diff --stat
# 注意:
# 1.你修改了某个文件,但是没有提交到暂存区,这时候会有对比的内容
# 一旦提交到暂存区,就不会有对比的内容(因为暂存区已经更新)
# 2.如果你新建了一个文件,但是没有提交到暂存区,这时候 diff 是没有结果的
$ git diff --cached/–staged
$ git diff branchname
$ git diff HEAD
$ git diff branchname…branchname filename
$ git diff branchname…branchname
$ git diff origin/branchname…branchname
$ git diff origin/branchname…origin/branchname
$ git diff commit1…commit2
复制代码
# 查看所有远程主机
$ git remote
# 查看关联的远程仓库的详细信息
$ git remote -v
# 删除远程仓库的 “关联”
$ git remote rm projectname
# 设置远程仓库的 “关联”
$ git remote set-url origin <newurl>
复制代码
常用于发布版本
www.liaoxuefeng.com/wiki/896043…
# 默认在 HEAD 上创建一个标签
$ git tag v1.0
# 指定一个 commit id 创建一个标签
$ git tag v0.9 f52c633
# 创建带有说明的标签,用 -a 指定标签名,-m 指定说明文字
$ git tag -a v0.1 -m "version 0.1 released"
$ git tag
$ git show <tagname>
$ git push origin <tagname>
$ git push origin --tags
$ git tag -d v0.1
$ git push origin :refs/tags/<tagname>
复制代码
# 删除暂存区和工作区的文件
$ git rm filename
# 只删除暂存区的文件,不会删除工作区的文件
$ git rm --cached filename
复制代码
如果在配置 .gitignore 文件之前就把某个文件上传到远程仓库了,这时候想把远程仓库中的该文件删除,此时你配置 .gitignore 文件也没有用,因为该文件已经被追踪了,但又不想在本地删除该文件后再重新提交到远程仓库,这时候可以使用 git rm --cached filename
命令取消该文件的追踪,这样下次提交的时候,git 就不会再提交这个文件,从而远程仓库的该文件也会被删除
# 恢复暂存区的指定文件到工作区
$ git checkout <filename>
# 恢复暂存区的所有文件到工作区
$ git checkout .
$ git checkout HEAD
$ git checkout HEAD – filename
$ git checkout HEAD^
$ git checkout HEAD^^
$ git checkout <当前你正在使用的分支>
$ git checkout <commit_id>
$ git checkout <tag>
复制代码
HEAD
一般指向 master 或是其他的本地分支,但当你使用 git checkout <commit id>
切换到指定的某一次提交的时候,HEAD
就不再指向一个分支了——它直接指向一个提交,HEAD 就会处于 detached 状态(游离状态)。git checkout branchName
回到项目初始的状态(这时候会提示你是否需要新建一条分支用于保留刚才的修改)。
git reset [--hard|soft|mixed|merge|keep] [<commit>或HEAD]
:将当前的分支重设(reset
)到指定的 <commit>
或者 HEAD
(默认,如果不显示指定 <commit>
,默认是 HEAD
,即最新的一次提交),并且根据 [mode]
有可能更新索引和工作目录。mode
的取值可以是 hard
、soft
、mixed
、merged
、keep
。
# 从暂存区撤销特定文件,但不改变工作区。它会取消这个文件的暂存,而不覆盖任何更改
$ git reset <fileName>
# 重置暂存区最近的一次提交,但工作区的文件不变
$ git reset
# 等价于
$ git reset HEAD (默认)
# 重置暂存区与工作区,回退到最近一次提交的版本内容
$ git reset --hard
# 重置暂存区与工作区,回退到最近一次提交的上一个版本
$ git reset --hard HEAD^
$ git reset <commit>
$ git reset --mixed <commit>
$ git reset --soft <commit>
$ git reset --hard <commit>
复制代码
git reset
有很多种用法。它可以被用来移除提交快照,尽管它通常被用来撤销暂存区和工作区的修改。不管是哪种情况,它应该只被用于本地修改——你永远不应该重设和其他开发者共享的快照。我们可以用 git reflog
查看历史命令,这样就可以看到之前新版本的 commit_id ,然后 git reset --hard commit_id
就可以回到之前的新版本代码
# 生成一个撤销最近的一次提交的新提交
$ git revert HEAD
# 生成一个撤销最近一次提交的上一次提交的新提交
$ git revert HEAD^
# 生成一个撤销最近一次提交的上两次提交的新提交
$ git revert HEAD^^
# 生成一个撤销最近一次提交的上n次提交的新提交
$ git revert HEAD~num
$ git revert <commit_id>
$ git revert <commit_id> --no-edit
复制代码
git revert
命令用来撤销某个已经提交的快照(和 reset 重置到某个指定版本不一样)。它是在提交记录最后面加上一个撤销了更改的新提交,而不是从项目历史中移除这个提交,这避免了 Git 丢失项目历史。
撤销(revert)应该用在你想要在项目历史中移除某个提交的时候。比如说,你在追踪一个 bug,然后你发现它是由一个提交造成的,这时候撤销就很有用。
撤销(revert)被设计为撤销公共提交的安全方式,重设(reset)被设计为重设本地更改。
因为两个命令的目的不同,它们的实现也不一样:重设完全地移除了一堆更改,而撤销保留了原来的更改,用一个新的提交来实现撤销。千万不要用 git reset
回退已经被推送到公共仓库上的 提交,它只适用于回退本地修改(从未提交到公共仓库中)。如果你需要修复一个公共提交,最好使用 git revert。
发布一个提交之后,你必须假设其他开发者会依赖于它。移除一个其他团队成员在上面继续开发的提交在协作时会引发严重的问题。当他们试着和你的仓库同步时,他们会发现项目历史的一部分突然消失了。一旦你在重设之后又增加了新的提交,Git 会认为你的本地历史已经和 origin/master 分叉了,同步你的仓库时的合并提交(merge commit)会使你的同事困惑。
将指定的提交 commit 应用于当前分支(可以用于恢复不小心撤销(revert/reset)的提交)
$ git cherry-pick <commit_id>
$ git cherry-pick <commit_id> <commit_id>
$ git cherry-pick <commit_id>^..<commit_id>
复制代码
# "终点"是最近的提交,"起点"是更久以前的提交
$ git bisect start [终点] [起点]
$ git bisect start HEAD commit_id
$ git bisect good
$ git bisect bad
$ git bisect reset
复制代码
有种情况我们经常会遇到:某个工作中的项目需要包含并使用另一个项目。也许是第三方库,或者你独立开发的,用于多个父项目的库。 现在问题来了:你想要把它们当做两个独立的项目,同时又想在一个项目中使用另一个。如果将另外一个项目中的代码复制到自己的项目中,那么你做的任何自定义修改都会使合并上游的改动变得困难。Git 通过子模块来解决这个问题,允许你将一个 Git 仓库作为另一个 Git 仓库的子目录。 它能让你将另一个仓库克隆到自己的项目中,同时还保持提交的独立。
# 在主项目中添加子项目,URL 为子模块的路径,path 为该子模块存储的目录路径
git submodule add [URL] [Path]
git clone [URL]
git submodule init
git submodule update
git submodule update --init
git clone --recurse-submodules [URL]
复制代码
# 初始化一个Git仓库
$ git init
# 关联远程仓库
$ git remote add <name> <git-repo-url>
# 例如
$ git remote add origin https://github.com/xxxxxx
复制代码
# 新建好远程仓库,然后 clone 到本地
$ git clone <git-repo-url>
$ git clone <git-repo-url> <project-name>
复制代码
预发布环境的作用: 预发布环境是正式发布前最后一次测试。因为在少数情况下即使预发布通过了,都不能保证正式生产环境可以100%不出问题;预发布环境的配置,数据库等都是跟线上一样;有些公司的预发布环境数据库是连接线上环境,有些公司预发布环境是单独的数据库;如果不设预发布环境,如果开发合并代码有问题,会直接将问题发布到线上,增加维护的成本。
pre-commit
就是在代码提交之前做些东西,比如代码打包,代码检测,称之为钩子(hook)npm install pre-commit --save-dev
复制代码
如果没有在 .git->hooks
目录下生成 pre-commit
文件的话,则要手工创建 node ./node_modules/pre-commit/install.js
"scripts": {
"build": "tsc",
"eslint": "eslint src --ext .ts",
"eslint:fix": "eslint src --ext .ts --fix"
},
//在提交代码之前,先执行 scripts 中的 eslint 命令
"pre-commit": [
"eslint"
]
复制代码
# 跳过验证
$ git commit --no-verify
$ git commit -n
复制代码
这时候可以回滚代码,重新拉取。
在 git 2.9.2 之后,不可以合并没有相同结点的分支(分支之间自仓库建立后,从来没有过互相拉取合并)。如果需要合并两个不同结点的分支,如下:
$ git pull origin branchName --allow-unrelated-histories
$ git merge branchName --allow-unrelated-histories
复制代码
这个功能是可以让大家不要把仓库上传错了,如果会加上这个代码,那么就是自己确定了上传。旧版本的 Git 很容易就把代码传错了,现在可以看到,如果上传的不是之前的,那么就需要加代码上传。 正常情况下,都是先建立仓库,然后切多个分支,分支先去拉取合并主分支的内容,然后再各自开发, 如果建立仓库后,各个分支没有区拉取主分支的代码,之后各个分支之间想要合并时就会报错。
error: merge is not possible because you have unmerged files.
hint: Fix them up in the work tree, and then use 'git add/rm <file>'
hint: as appropriate to mark resolution and make a commit.
fatal: Exiting because of an unresolved conflict.
复制代码
当远程分支和本地分支发生冲突后,git 保持合并状态,你如果没有去解决完所有的冲突,那么 git 会一直保持这个状态,你就无法再提交代码。只有先解除合并状态后,才能继续提交。执行命令前最好先备份一下,有可能本地做的修改会被远程分支覆盖掉。
# 解除合并状态
$ git merge --abort
复制代码
# 删除暂存区和工作区的文件
$ git rm filename
# 只删除暂存区的文件,不会删除工作区的文件
$ git rm --cached filename
复制代码
如果在配置 .gitignore 文件之前就把某个文件上传到远程仓库了,这时候想把远程仓库中的该文件删除,此时你配置 .gitignore 文件也没有用,因为该文件已经被追踪了,但又不想在本地删除该文件后再重新提交到远程仓库,这时候可以使用 git rm --cached filename
命令取消该文件的追踪,这样下次提交的时候,git 就不会再提交这个文件,从而远程仓库的该文件也会被删除
之前没有进行过关联,即没有通过 clone 远程项目到本地再开始做项目,而是先本地新建了一个项目,然后想传到远程仓库上。
# 将本地仓库和远程仓库关联起来
$ git remote add origin 远程仓库地址
# 将本地的 master 分支推送到 origin 主机,同时指定 origin 为默认主机
$ git push -u origin master
# 上面的命名执行后,下次再从本地库上传内容的时候只需下面这样就可以了
$ git push
复制代码
www.liaoxuefeng.com/wiki/896043…
ssh-keygen -t rsa -C "xxxxx@xxxxx.com"
# Generating public/private rsa key pair...
# 三次回车即可生成 ssh key
复制代码
cat ~/.ssh/id_rsa.pub
复制代码
测试 ssh 是否能够连接成功
$ ssh -T git@github.com
复制代码
使用 ssh 协议
$ git remote set-url origin git@xxx.com:xxx/xxx.git
复制代码
一般为 C:\users\Administrator,也可以是你自己创建的系统用户名目录,文件名为 .git-credentials。由于在 Windows 中不允许直接创建以 "." 开头的文件,所以用命令行创建该文件。
$ touch .git-credentials
$ echo "http://{username}:{password}@github.com" >> ~/.git-credentials
$ git config --global credential.helper store
复制代码
可以在当前目录下,添加一个 .gitkeep 文件
git add .
无法进行文件追踪,可以使用 git add -A
,这也就是每次提交前都要 git status
的原因原因在于 Git 在使用过程中遭遇了奔溃,部分被上锁资源没有被释放导致的。
解决方案: 进入项目文件夹下的 .git 文件中(显示隐藏文件夹或 rm .git/index.lock
)删除 index.lock 文件即可。
git commit -am "xxx"
只会将被 tracked 的文件添加到暂存区并提交,而将文件添加到 git 管理是要使用 git add 命令,将新的文件 tracked 。(新建了文件之后,idea 会提示你是否需要加到 git 管理中。选择记住后,之后 idea 默认都会把新建的文件 tracked 化)
从合并后的代码来看,结果都是一样的,区别就在于 --no-ff
会让 git 生成一个新的提交对象。为什么要这样?通常我们把 master 作为主分支,上面存放的都是比较稳定的代码,提交频率也很低,而 feature 是用来开发特性的,上面会存在许多零碎的提交,快进式合并会把 feature 的提交历史混入到 master 中,搅乱 master 的提交历史。所以如果你根本不在意提交历史,也不爱管 master 干不干净,那么 --no-ff
其实没什么用。
# 试试
$ git -c core.pager=more log
# 如果可以显示中文的话,把 pager 设置为 more
$ git config --global core.pager more
复制代码
想要 merge 别人的分支时:
git add .
追踪文件,那么 git stash
是无法存储的$ git stash -u
复制代码
可能出现的报错:
remote: Permission to xxxxx.git denied to xxx. fatal: unable to access 'github.com/ xxxxx.git/': The requested URL returned error: 403
remote: You do not have permission to push to the repository via HTTPS
fatal: Authentication failed for 'gitee.com/xxx.git/'
# 查看当前项目的 git 配置
$ cat .git/config
复制代码
git push
的数据协议有两种方式:ssh
和 https
。如果不一致就需要切换 url
地址。remote: Coding 提示: Authentication failed.
remote: 认证失败,请确认您输入了正确的账号密码。
fatal: Authentication failed for 'https://e.coding.net/xxx.git/'
复制代码
在控制面板里找到凭据管理器,选中 Windows 凭据,找到 git 的凭据,点击编辑,输入所用 github 的正确用户名和密码。
可能你的项目名路径中包含了中文名,需要替换成英文名
which git
,就会显示 git 的安装位置了where git
,就会显示 git 的安装路径了git rebase -i
复制代码
如果两个人都对同一个文件重命名,此时会起冲突,git 不会自动处理,需要开发者自身去解决冲突
git revert -m 1
复制代码
在 Git 中创建分支,是必须有一个父节点的,也就是说必须在已有的分支上来创建新的分支,如果工程已经进行了一段时间,这个时候是无法创建空分支的。但是有时候就是需要创建一个空白的分支。
$ git checkout --orphan emptyBranchName
复制代码
该命令会生成一个叫 emptybranch
的分支,该分支会包含父分支的所有文件。但新的分支不会指向任何以前的提交,就是它没有历史,如果你提交当前内容,那么这次提交就是这个分支的首次提交。
想要空分支,所以需要把当前内容全部删除,用 git 命令
$ git rm -rf . // 注意:最后的‘.’不能少。
复制代码
先删除该分支,然后再新建一个空的分支(分支名就是删除的分支名)~~
傻傻分不清之 Cookie、Session、Token、JWT
Github API 调用 (v3)
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。