文章目录
参考
- 沙盒动画演示Git命令:Learn Git Branching
- 参考:廖雪峰 Git 教程
- 参考:Git - Book
Git 数据传输命令工作图
图片来自:https://blog.osteele.com/2008/05/my-git-workflow/
配置信息
- 查看 Git 的版本:
$ git version
- 查看 Git 的某一项配置:
git config <key>
- 查看配置信息:
$ git config --list
- 全局信息
- 设置全局用户名:
$ git config --global user.name "your name"
- 设置全局邮箱地址:
$ git config --global user.email "email-address"
- 设置默认编辑器:
$ git config --global core.editor Vim
- 查看全局用户名:
$ git config --global user.name
- 查看全局邮箱地址:
$ git config --global user.email
- 查看全局配置信息:
$ git config --global --list
- 查看本地用户:
$ whoami
- 设置全局用户名:
- 局部信息
- 添加或者修改局部用户名:
$ git config user.name "your name"
- 添加或者修改局部邮箱地址:
$ git config user.email "email address"
- 查看局部用户名:
$ git config --local user.name
- 查看局部邮箱地址:
$ git config --local user.email
- 查看局部配置信息:
$ git config --local --list
- 添加或者修改局部用户名:
SSH Key
- 查看 SSH Key:
$ cat ~/.ssh/id_rsa.pub
- 注:若成功输出表示存在SSH公钥,若显示
No such file or directory
则需要去创建一个新的SSH Key
- 注:若成功输出表示存在SSH公钥,若显示
- 创建 SSH Key:
$ ssh-keygen -t rsa -C "yourname@email.com"
- 注:若SSH Key创建成功,
.ssh
目录中会有秘钥对id_rsa
和id_rsa.pub
两个文件,id_rsa
是私钥不能暴露,id_rsa.pub
是公钥可以暴露给外界
- 注:若SSH Key创建成功,
- 查看与远程仓库的SSH连接:
$ ssh -T git@github.com
- 在 GitHub 中配置 SSH Key:
- 打开 Account settings – SSH Keys 页面
- 点击 Add SSH Key,填上任意 Title,在 Key 文本框里粘贴
id_rsa.pub
文件的内容
目录及其操作
- Git Bash路径中的
/
:表示Git的安装根目录,使用$ cd /
可进入 - Git Bash路径中的
~
:表示Home
目录,是Git的默认工作路径,使用$ cd ~
可进入- 默认工作路径:如SSH Key、用户配置文件.gitconfig等都是放在此目录下的
- 查看当前的工作路径:
$ cd ~
先进入工作路径,$ pwd
再查看一下所在位置 - 设置默认工作路径:在环境变量–用户变量中新建
Home
,值为想要设置的路径
- 进入下一级目录:
$ cd <dir>
- 返回上一级目录:
$ cd ..
- 创建一个新目录:
$ mkdir <dir>
- 显示当前目录相对于 Git 根目录的地址:
$ pwd
- 显示目录中的文件:
- 显示较为简洁:
$ ls
- 显示较为详细:
$ ll
- 显示全部文件:
$ ls -a
- 显示较为简洁:
- 移动目录:
$ mv <dir-1> <dir-2>
。将目录 dir-1 移动到目录 dir-2 下成为其子目录 - 重命名目录:
$ mv <old> <new>
。将目录名 old 更改为 new - 删除空目录:
$ rmdir <dir>
。此命令只能删除空目录 - 删除目录:
$ rm -r <dir>
。删除目录下全部内容
文件及其操作
创建、查看、删除文件
- 创建新文件:
$ touch <file>
。例如:创建 temp.txt 文件:$ touch temp.txt
- 移动文件到指定目录:
$ mv <file> <dir>
。例如:移动到 dir 目录下:$ mv temp.txt ./dir
- 重命名文件:
$ mv <old-fileName> <new-fileName>
- 复制文件:
$ cp <file> <dir>
- 查看文件内容:
$ cat <file>
$ head <file>
$ tail <file>
- 查看文件的开头几行内容:
$ head -3 <file>
。查看文件的前 3 行内容 - 查看文件的倒数几行内容:
$ tail -9 <file>
。查看文件的倒数 9 行内容 - 删除文件:
- 只删除工作区的文件:
$ rm <file>
- 注:执行此命令需要手动使用
add
命令将删除操作添加到暂存区
- 注:执行此命令需要手动使用
- 同时删除工作区和暂存区的文件:
$ git rm <file>
- 注:执行此命令自动将删除操作添加到暂存区
- 只删除工作区的文件:
- 覆盖文件内容:
$ echo "content" > <file>
- 追加内容到文件末尾:
$ echo "content" >> <file>
比较文件、提交的差异
- 比较工作区和暂存区的文件差异:
$ git diff
- 比较暂存区与最新本地版本库:
$ git diff --cached
- 比较工作区与最新本地版本库:
$ git diff HEAD
- 比较工作区与指定提交的差异:
$ git diff <commit-ref>
- 比较暂存区与指定提交的差异:
$ git diff --cached <commit-ref>
- 比较两个提交之间的差异:
$ git diff <commit-ref> <commit-ref>
版本库相关操作:repository
新建版本库与提交版本
- 从已存在的目录新建一个版本库:
$ git init
- 查看工作区与暂存区的内容:
$ git status
- 将操作从工作区添加到暂存区:
$ git add <file>
- 注:
add
命令可以执行多次,将多个操作添加到暂存区
- 注:
- 将操作从暂存区提交到版本库:
$ git commit -m "此次提交说明"
- 注:
commit
命令可以一次性将暂存区的所有操作提交至版本库
- 注:
- 撤销上一次提交并将暂存区文件重新提交:
$ git commit --amend
- 带上提交信息:
$ git commit --amend -m "commit message"
- 注:如果自上次提交以来你还未做任何修改,例如在上次提交后又立即执行此命令,那么快照会保持不变,而修改的只是提交信息
- 注:如果暂存区中内容已修改,最终你只会有一个提交:第二次提交将代替第一次提交的结果
- 带上提交信息:
- 选取一个或多个提交复制到当前分支:
$ git cherry-pick <commit-ref> [commit-ref...n]
撤销文件操作
- 撤销工作区的文件修改:
$ git checkout -- <file>
- 注:此命令只能撤销工作区的文件修改
- 移除暂存区中文件至工作区:
$ git reset HEAD <file>
- 注:当存在提交历史时可使用此命令,将文件从暂存区移除,并放到工作区
- 移除暂存区中文件至未跟踪状态:
$ git rm --cached <file>
- 撤销对文件的更改
- 对文件的更改操作在工作区,未添加到暂存区,舍弃更改只需一步:
$ git checkout -- <file>
- 对文件的更改操作已添加到暂存区,但未提交到版本库,恢复文件需要两步:
- 第一步,从暂存区移除到工作区:
$ git reset HEAD <file>
- 第二步,从工作区舍弃文件更改:
$ git checkout -- <file>
- 第一步,从暂存区移除到工作区:
- 如果文件更改操作已经提交至版本库:那么使用版本回退
- 对文件的更改操作在工作区,未添加到暂存区,舍弃更改只需一步:
版本回退
- 版本回退的两种命令:
git reset
和git revert
git reset
描述:将当前分支回退到指定版本(往后退),在指定版本之后的版本在当前分支上被删除了$ git reset HEAD~ 回退到上个版本,提交4在当前分支上被删除 提交1 <-- 提交2 <-- 提交3 <-- 提交4 | | reset后分支指向 原来分支指向
git revert
描述:在当前分支上再提交一个新版本(往前走),新版本与被回退版本的父版本相同,效果就是被回退的版本还在当前分支上,但是被新提交的版本覆盖了,也就实现了版本回退$ git revert HEAD 回退到上个版本,提交4被保留了,但是被新提交覆盖了 提交1 <-- 提交2 <-- 提交3 <-- 提交4 <-- 提交5(copy_提交3) | | 原来分支指向 revert后分支指向
- 使用
reset
- 方式一,回退到相对位置:
$ git reset --mixed HEAD~
- 注:上个版本是
HEAD~
,往上n个版本写成HEAD~n
- 注:上个版本是
- 方式二,回退到某次提交:
$ git reset --mixed <commit-ref>
- 指向
commit-id
的索引,若直接填写commit-id
,一般取版本号的前 7 位即可
- 指向
reset
命令的三种参数:--mixed
、--soft
、--hard
--soft
:回退到指定版本,文件更改有效,将文件移至暂存区,等待commit
--mixed
:默认参数,回退到指定版本,文件更改有效,将文件移至工作区,等待add
--hard
:回退到指定版本,直接舍弃被提交的文件更改,暂存区和工作区也被清空
- 方式一,回退到相对位置:
- 使用
revert
- 回退到上个版本:
$ git revert HEAD
- 撤销
revert
操作:$ git revert --abort
- 注:此命令必须在本次
revert
操作未提交的状态下才能成功执行,若已提交则撤销失败
- 注:此命令必须在本次
- 回退到上个版本:
查看提交记录
- 查看所有本地分支的最新提交:
$ git branch -vv
- 查看所有本地分支与远程分支的最新提交:
$ git branch -a -vv
- 查看各分支的提交记录:
$ git log
- 显示在一行内,缩短
commit-id
:$ git log --oneline
- 显示在一行内,完整显示
commit-id
:$ git log --pretty=oneline
- 显示最近 n 次提交记录:
$ git log -n
- 显示在一行内,缩短
- 查看指定某次提交的数据:
$ git show <commit-ref>
- 查看指定分支的提交记录:
$ git log $<branch-name>
- 查看指定标签的提交记录:
$ git log $<tag-name>
- 查看指定文件的提交记录:
$ git log <file>
- 一行内显示:
$ git log --oneline <file>
- 最近 n 次提交:
$ git log -n --oneline <file>
- 一行内显示:
- 查看各分支详细的提交数据:
git log -p
- 注:
git log
不能查看已删除的提交记录,即如果进行了版本回退,那么回退版本号之后再提交的记录都不能查看,若要查看全部提交记录使用$ git reflog
- 注:
- 查看所有可引用历史版本记录:
$ git reflog
- 注:包括被删除的
commit
,reset
、checkout
、merge
、rebase
、pull
等操作记录
- 注:包括被删除的
- 查看命令行历史记录:
$ history
远程仓库:remote
查看与设置远程仓库
- 查看远程仓库名称:
$ git remote
- 查看远程仓库的详细信息:
$ git remote show <remote-name>
- 查看远程仓库的抓取与推送地址:
$ git remote -v
- 注:如果没有抓取或推送的权限,就看不到相应的地址
- 查看远程仓库的引用信息:
$ git ls-remote
- 添加远程仓库:
$ git remote add <remote-name> <remote-url>
- 删除远程仓库:
$ git remote remove <remote-name>
- 重命名远程仓库:
$ git remote rename <old-remote> <new-remote>
- 同步远程仓库与本地仓库的改动:
$ git remote prune <remote-name>
- 注:当远程分支已经被删除时,在本地
$ git branch -a
查看时,发现那些被删除的分支还在,这时就需要同步一下改动
- 注:当远程分支已经被删除时,在本地
连接与取消连接远程仓库
- 连接远程仓库:
- 使用 SSH 连接:
$ git remote add origin git@github.com:your/yourRepos.git
- 使用HTTP连接:
$ git remote add origin https://github.com/your/yourRepos.git
- 注:这里远程仓库的默认名字是
origin
,也可以改成别的
- 使用 SSH 连接:
- 取消与远程仓库的连接:
$ git remote rm <remote-name>
- 修改远程仓库地址:
$ git remote set-url <remote-name> <url>
- 注:切换
<url>
为SSH地址或者HTTP地址,即可改变与远程仓库的连接方式
- 注:切换
推送到远程仓库
- 推送命令格式:
$ git push <远程仓库名> <本地分支名>:<远程分支名>
- 推送当前分支到跟踪的远程分支:
$ git push
- 相同效果指令:
$ git push origin
- 相同效果指令:
- 推送指定本地分支到远程分支:
$ git push origin <local-branch>
- 注:推送指定本地分支
<local-branch>
的提交到对应的远程分支,若没有对应远程分支则新建与本地分支同名的分支,但不设置两者的跟踪关系。
- 注:推送指定本地分支
- 推送指定本地分支到远程分支,并设置跟踪关系:
$ git push -u origin <local-branch>
- 注:各个本地分支第一次推送到远程分支时加上
-u
参数,Git 将提交推送到远程分支,若没有对应远程分支则新建与本地分支同名的分支,同时设置本地分支跟踪对应的远程分支
- 注:各个本地分支第一次推送到远程分支时加上
- 推送指定本地分支到指定远程分支:
$ git push origin <local-branch>:<remote-branch>
- 例如:推送本地分支
local-branch
的提交到远程仓库的remote-branch
分支,若远程仓库没有remote-branch
分支就会创建此新分支 - 通过此命令来推送本地分支到一个命名不相同的远程分支
- 例如:推送本地分支
- 强制推送至远程分支:
$ git push -f origin <local-branch>
- 注:若远程分支与本地分支存在差异,不能直接推送时,使用强制推送命令
从远程仓库拉取
- 拉取命令格式:
$ git pull <远程仓库名> <远程分支名>:<本地分支名>
- 从远程分支获取最新提交到本地分支有两个命令
git fetch
:此命令只将远程分支提交抓取到本地,但是并没有修改本地的文件。是否进行合并、变基等操作,可以对比当前分支和拉取的提交之间的差异再做决定git pull
:此命令抓取远程分支提交到本地后直接与当前分支进行合并形成一个新的提交。简单地讲:pull
=fetch
+merge
- 抓取远程仓库最新的内容:
$ git fetch --all
- 抓取指定远程分支到当前分支:
$ git fetch origin <remote-branch>
- 从远程分支抓取的提交在本地用
FETCH_HEAD
指向 - 对比拉取的提交和当前分支的差异:
$ git diff <branch-name> FETCH_HEAD
- 若需要合并至当前分支则:
$ git merge FETCH_HEAD
- 从远程分支抓取的提交在本地用
- 拉取指定远程分支到当前分支:
$ git pull origin <remote-branch>
- 拉取指定远程分支到指定本地分支:
$ git pull origin <remote-branch>:<local-branch>
- 拉取指定远程分支到当前分支,并将当前分支变基到其上:
$ git pull --rebase origin <remote-branch>
- 是
git fetch
和git rebase
的组合
- 是
- 克隆远程仓库:
$ git clone git@github.com:your/yourRepos.git
- 注:进入任意目录中,执行克隆指令将远程仓库完整的克隆一份到当前目录
分支管理:branch
- 分支
- 本地分支:是本地仓库中的普通分支。
- 远程分支:是远程仓库中的普通分支。
- 跟踪分支:是本地分支,但跟踪了一个远程分支。是本地分支与远程分支对应的关系,可以看出本地分支与跟踪的远程分支的超前落后情况。
- 远程跟踪分支:是在本地的只读的记录远程分支状态的分支,其指向用户无法移动,当使用
git fetch
等指令时其指向会依照远程仓库自动移动。
- 分支管理
master
分支:此分支应该是非常稳定的,也就是仅用来发布新版本,平时不能在上面进行工作dev
分支:此分支是工作分支,是不稳定的。在需要发布新版本时:把dev
分支合并到master
上,在master
分支上发布新版本own-branch
:团队每个人自己的工作分支,时不时的将工作进度合并到dev
分支上,构成整个团队的开发进度issue
分支:此分支是Bug
分支,每个Bug
都可以通过一个新的临时分支来修复,如issue-001
,修复后再合并分支,然后将临时分支删除feature
分支:开发新功能,实验性功能分支;每添加一个新功能,可以新建一个feature
分支,在上面开发,完成后合并分支,最后删除该feature
分支
查看分支
- 查看
HEAD
指向:$ git show HEAD
- 查看所有本地分支:
$ git branch
- 查看本地与远程仓库的所有分支:
$ git branch -a
- 查看指定分支的提交记录:
$ git log $<branch-name>
- 查看本地分支与其跟踪的远程分支:
git branch -vv
- 注:此命令可比较本地分支与其跟踪的远程分支的提交情况
- 重命名分支:
$ git branch -m <old-branch> <new-branch>
- 注:重命名分支不会改变提交记录、跟踪关系等数据
创建分支
- 创建本地新分支:
$ git branch <branch-name>
- 注:以当前
HEAD
指向为参考创建一个新分支
- 注:以当前
- 以某次
commit
为参考创建本地新分支:git branch <branch-name> <commit-ref>
- 注:参考只要是一个可以标识
commit
的引用就可以
- 注:参考只要是一个可以标识
- 创建远程新分支:
$ git push origin <remote-branch>
- 注:此命令作用是将本地当前分支内容推送到远程分支,但是如果远程仓库中没有
<remote-branch>
分支,那么就会创建新分支并推送内容
- 注:此命令作用是将本地当前分支内容推送到远程分支,但是如果远程仓库中没有
- 切换到分支:
$ git checkout <branch-name>
- 创建新分支并切换到新分支:
$ git checkout -b <branch-name>
- 基于远程分支创建本地分支:
$ git branch <local-branch> origin/<remote-branch>
- 注:在本地新建分支
<local-branch>
,并且跟踪远程分支origin/<remote-branch>
- 此命令可以自定义本地分支名称,但是本地分支和远程分支的名称最好一致
- 注:在本地新建分支
- 基于远程分支创建本地分支:
$ git checkout --track origin/<remote-branch>
- 注:此命令创建的本地分支与远程分支同名,并且自动建立跟踪关系,同时切换到本地新建分支
- 创建新的空白分支:
$ git branch --orphan <branch-name>
- 注:不管处在任何现有提交节点,创建一个没有提交记录的空白分支
- 用处:创建一个空白分支,再删除其他所有分支,则相当于删除了原有的全部提交记录,可以从新开始了
比较分支的不同
- 查看两个分支的差异:
$ git diff <branch-name> <branch-name>
- 查看
dev
分支有,而master
分支没有的:$ git log dev ^master
- 注:两个分支比较,
^
表示对应分支没有的提交
- 注:两个分支比较,
- 查看
master
分支比dev
分支多提交了哪些内容:$ git log dev..master
- 注:
..
后面的分支比前面的分支多提交了哪些内容
- 注:
- 不知道谁提交的多谁提交的少,只想知道有什么不同:
$ git log dev...master
- 比较不同时显示出每个提交是在哪个分支上:
$ git log --left-right dev...master
- 注:显示结果中,
<
代表提交在dev
分支上,>
代表提交在master
分支上
- 注:显示结果中,
- 比较本地分支与远程分支的不同:
$ git log -p <local-branch>..origin/<remote-branch>
删除分支
- 删除本地分支:
$ git branch -d <local-branch>
- 注:删除的分支必须是被合并过的分支
- 强制删除未合并过的本地分支:
$ git branch -D <local-branch>
- 注:分支存在修改但还没有被合并,此时删除分支将会丢失修改,系统会阻止删除操作,若需要强行删除则使用大写的
-D
参数
- 注:分支存在修改但还没有被合并,此时删除分支将会丢失修改,系统会阻止删除操作,若需要强行删除则使用大写的
- 删除远程仓库指定分支:
- 方式一:
$ git push origin -d <remote-branch>
- 方式二:
$ git push origin :<remote-branch>
- 方式一:
合并分支:merge
- 合并分支:把当前分支与被合并分支两个分支的最新提交以及二者最近的共同祖先进行三方合并,合并的结果是生成一个新的快照,并提交
- 合并指定分支到当前分支:
$ git merge <branch-name>
- 注:若当前分支是
master
,那么此命令就是将<branch-name>
分支合并到master
上、
- 注:若当前分支是
- 合并远程分支到本地当前分支:
$ git merge origin/<remote-branch>
- 撤销此次的合并分支:
$ git merge --abort
- 合并指定分支到当前分支并且不使用
fast forward
模式:$ git merge --no-ff -m "commit message" <branch-name>
- 注:
--no-ff
表示强制禁用fast forward
模式,Git 就会在merge
时生成一个新的commit
,这样,从分支历史上就可以看出分支信息
- 注:
变基:rebase
- 详情参阅
- Git 中,整合来自不同分支的修改主要有两种方法:
merge
以及rebase
,即合并分支与变基 - 变基:
rebase
命令将某一分支的提交转移到指定的分支上。 - 注:无论
rebase
或者merge
,整合的最终结果所指向的快照都是一样的,只不过提交历史不同罢了。 变基是将一个分支的一系列提交按照原有次序依次转移到另一分支上,而合并是把最终结果合在一起 - 变基的风险,使用变基要用它得遵守一条准则:
- 不要对在你的仓库外有副本的分支执行变基
- 总的原则是:只对尚未推送或分享给别人的本地修改执行变基操作清理历史,从不对已推送至别处的提交执行变基操作
- 将当前分支变基到目标分支上:
$ git rebase <dest-branch>
- 注:将当前分支的提交依次转移到
<dest-branch>
分支上
- 注:将当前分支的提交依次转移到
- 指定两个分支进行变基:
$ git rebase <dest-branch> <src-branch>
- 注:将后一个分支的提交转移到前一个分支上
- 交互式修改提交:
$ git rebase -i <commit-ref~[n|^n]>
- 注:在编辑器中修改
commit-ref
向前~n
个,路径从某个父提交^n
- 注:在编辑器中修改
- 将从一个分支上创建的分支变基到另一个分支:
$ git rebase --onto master server client
- 此例中:
client
分支是从server
分支上创建的,只想单独变基client
分支到master
分支 - 以上命令的意思是:取出
client
分支,找出处于client
分支和server
分支的共同祖先之后的修改,变基到master
分支上
- 此例中:
储藏分支:stash
- 储存并隐藏未完结的修改、未提交的修改:
$ git stash
- 注:将工作区和暂存区中没有
commit
的内容隐藏起来,之后在工作区中就是干净的。把当前工作现场储藏起来,可以等到以后恢复现场后继续工作 - 注:可以多次将未提交的修改储藏,如同一个栈
- 用处:当想要切换分支时当前分支存在未提交的修改时,不能切换分支,此时可使用此命令将未提交的修改储藏起来,再切换到其他分支
- 注:将工作区和暂存区中没有
- 查看储藏的内容:
$ git stash list
- 将最后一条记录储藏的内容恢复到工作区:
$ git stash apply
- 注:执行此命令将内容恢复后,
stash
内容并不删除,需要用git stash drop
来删除 - 注:最后一条记录如同栈顶
- 注:执行此命令将内容恢复后,
- 将指定的储藏的内容恢复到工作区:
$ git stash apply stash@{n}
- 注:将储藏的第
n
条记录恢复到工作区,n
从 0 开始
- 注:将储藏的第
- 删除储藏的内容:
$ git stash drop
- 注:此命令每次只能删除一条储藏记录
- 恢复的同时在
stash
中删除内容:$ git stash pop
- 注:当恢复时没有产生冲突,此命令恢复的同时会删除此次
stash
内容记录 - 注:当恢复时产生冲突,此命令恢复之后会保留此次
stash
内容记录
- 注:当恢复时没有产生冲突,此命令恢复的同时会删除此次
设置本地分支跟踪远程分支
- 设置当前分支跟踪指定远程分支:
$ git branch -u origin/<remote-branch>
- 在远程分支的基础上新建本地分支,自动建立跟踪关系:
$ git branch <local-branch> origin/<remote-branch>
- 设置指定本地分支跟踪指定远程分支:
$ git branch --set-upstream-to=origin/<remote-branch> <local-branch>
- 在推送时设置本地分支跟踪远程分支:
$ git push --set-upstream origin <remote-branch>
- 取消本地当前分支跟踪远程分支:
$ git branch --unset-upstream
图示分支合并与变基
当前分支master指向'提交2',dev分支指向'提交3'
--------------------------------------------------------------------------------
原本提交树 执行合并分支 执行变基
git merge dev git rebase dev
提交1 提交1 提交1
/ \ / \ / \
master-> 提交2 提交3 <-dev 提交2 提交3 <-dev X(提交2) 提交3 <-dev
\ / |
提交4 <-master 提交2`<-master
标签管理:tag
- 标签描述
- 标签:
tag
是取一个让人容易记住的有意义的名字,它跟某个commit
绑在一起。Git 的标签是版本库的快照,但其实它就是指向某个commit
的指针(跟分支很像,但是分支可以移动,标签不能移动),所以,创建和删除标签都是瞬间完成的 - 注意:标签总是和某个
commit
挂钩。如果这个commit
既出现在master
分支,又出现在dev
分支,那么在这两个分支上都可以看到这个标签
- 标签:
- 查看标签
- 查看所有标签:
$ git tag
- 查看指定标签的数据:
$ git show <tag-name>
- 查看指定标签的提交记录:
$ git log $<tag-name>
- 查看所有标签:
- 新建标签
- 新建标签:
$ git tag <tag-name>
- 注:标签默认是打在当前
HEAD
指向的commit
上
- 注:标签默认是打在当前
- 给指定的
commit-ref
打上标签:$ git tag <tag-name> <commit-ref>
- 创建带有说明的标签:
$ git tag -a <tag-name> -m "tag-description" <commit-ref>
- 注:用
-a
指定标签名,-m
指定说明文字
- 注:用
- 新建标签:
- 推送标签
- 推送某个标签到远程:
$ git push origin <tag-name>
- 注:推送本地标签到远程,所以此标签必须已存在
- 一次性推送全部未推送过的本地标签到远程:
$ git push origin --tags
- 推送某个标签到远程:
- 删除标签
- 因为创建的标签都只存储在本地,不会自动推送到远程。所以打错的标签可以在本地安全删除
- 删除本地某个标签:
$ git tag -d <tag-name>
- 删除远程仓库的标签:
$ git push origin -d <tag-name>
- 删除远程仓库的标签:
$ git push origin :refs/tags/<tag-name>
常见的问题
与文件操作相关
- 设置Git的默认工作路径:
- 问题描述:在 Windows’下安装 Git后,默认的默认工作路径和开始路径一般都是:C:\Users\用户名。当不想将一些运行文件放在默认工作路径下时需要修改
- 解决方式:可采用配置环境变量的方式修改默认工作路径
- 新建环境变量–用户变量
Home
,将值设置为想要更改的路径 - 如果在原来的用户主目录下已经生成了.ssh、.gnupg、.bash_history、.gitconfig等文件,直接把这些文件拷贝到新设定的默认工作路径下即可
- 重启Git
- 新建环境变量–用户变量
- 设置Git Bash的开始路径:
- 问题描述:在Windows下安装 Git后,默认工作路径和开始路径一般都是:C:\Users\用户名。但这并不是放置 repository的工作目录,不想每次启动 Git Bash都要手动进入你的工作目录
- 解决方式:通过修改快捷方式的路径即可修改默认路径
- 找到 Git Bash的快捷方式,鼠标右键 --> ‘属性’
- 会看到 ‘目标’ 和 ‘起始位置’ ,如下:
- 目 标 : G:\Git\git-bash.exe --cd-to-home
- 起始位置 : %HOMEDRIVE%%HOMEPATH%
- 去掉 ‘目标’ 的:–cd-to-home
- 修改 ‘起始位置’ 为自定义的 ‘Git’ 本地仓库的路径,如:G:\Git Workspace
- 重启Git Bash即可
- 输入
$ git add <file>
后出现警告:- 显示以下信息
warning: LF will be replaced by CRLF in ...... The file will have its original line endings in your working directory.
- 问题原因:是因为路径中存在 / 符号的转义问题:false就是不转换符号,默认是true,相当于把路径的 / 符号进行转义,这样添加的时候就有问题
- 解决方法,输入命令:
$ git config --global core.autocrlf false
- 显示以下信息
与远程仓库相关
- 如果在第一次推送到远程仓库时出现不能推送的错误
- 显示以下错误信息
error: failed to push some refs to 'https://github.com/your/repository.git' hint: Updates were rejected because the remote contains work that you do not have locally. This is usually caused by another repository pushing hint: ......
- 问题原因:因为远程仓库中已经进行了初始化操作,已经存在 readme.md 或者其他文件了,所以需要先pull下来。命令如下:
$ git pull origin master
这时又会报错:前面有些内容, ...... fatal: refusing to merge unrelated histories
- 解决方法:意思是说这两个库有不相干的历史记录而无法合并,重新执行以下命令即可成功 pull:
$ git pull origin master --allow-unrelated-histories
- 但是这时会可能会提示必须输入提交的信息,默认会打开 vim 编辑器,先按 i 切换到插入模式。
写完后 Esc→:→wq 即可保存退出编辑器。如果不进入 vim 编辑器,则会自动生成一个合并代码的commit
。
然后再使用前面的命令push将本地提交推送到远程仓库。后面如果本地还有commit
,就可以直接用$ git push origin master
推送
- 显示以下错误信息
- 使用
$ git push
命令时出现错误- 提示如下:
fatal: The current branch master has no upstream branch. To push the current branch and set the remote as upstream, use git push --set-upstream origin master
- 接下来输入:
$ git branch --set-upstream-to=origin/master master
;又会出现如下提示:error: the requested upstream branch 'upstream/master'does not exist hint:......
- 问题原因:本地分支没有与远程分支建立关联
- 解决方法:
- 第一步:
$ git pull origin master --allow-unrelated-histories
- 第二步:
$ git branch --set-upstream-to=origin/master master
- 第一步:
- 提示如下:
与分支操作相关
- 当执行合并分支命令
git merge
时,出现冲突导致不能合并分支- 出现如下提示:
Auto-merging test.txt CONFLICT (content): Merge conflict in test.txt Automatic merge failed; fix conflicts and then commit the result.
- 问题原因:很可能是当前分支与想要合并的分支各自都分别有新的提交
- 这时可以使用
git status
查看冲突的文件,也可以使用cat
命令查看冲突的内容 - 可以使用
$ git log --graph
查看分支合并情况
- 这时可以使用
- 解决方法:当 Git 无法自动合并分支时,就必须首先解决冲突。解决冲突后,再提交,合并完成。
- 解决冲突就是把 Git 合并失败的文件手动编辑为我们希望的内容,再提交
- 出现如下提示:
- 删除分支出错
- 显示如下错误信息
error: The branch 'temp' is not fully merged. If you are sure you want to delete it, run 'git branch -D temp'.
- 问题原因:提示被删除的分支修改了内容还没有未被合并过,如果删除将会丢失修改,系统会阻止删除操作。
- 解决方法:合并分支之后再删除,或者强制删除分支:
$ git branch -D <branch-name>
- 显示如下错误信息
使用 Git 注意的地方
cd
命令进行目录切换时需要注意目录中的空格:- 解决方式一:使用
""
引号将目录名括起来 - 解决方式二:使用
\
加上空格,代替直接输入空格
- 解决方式一:使用
- 分支合并
- 如果需要合并的两个分支都各自有新的提交,这时使用分支合并命令很可能会产生冲突。此时应该 手动编辑 合并失败的文件为我们希望的内容。然后再提交,最后再重新执行合并命令
- 如果只是其中一个分支有新的提交,合并应该就没有问题