本文章为作者学习 Git 途中一点一点积累的学习笔记。文章中有些内容是网上查找之后觉得有用就记录在案,仅供读者查阅参考,如果要用于生产,请先试验以保证数据安全。
前往 GitHub:在 GitHub 中查看本文
参考:廖雪峰 Git 教程
参考:Git - Book
图片来自:https://blog.osteele.com/2008/05/my-git-workflow/
$ git help
config
命令的手册,执行:$ git help config
$ git
$ man git-
查看 Git
的版本:$ git version
检查 Git 的某一项配置:git config
查看配置信息:$ git config --list
$ git config --global core.editor Vim
Git Bash
界面中的内容:$ clear
添加或者修改全局用户名:$ git config --global user.name "your name"
添加或者修改全局邮箱地址:$ git config --global user.email "email address"
查看全局用户名:$ 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:$ cd ~/.ssh
No such file or directory
则需要去创建一个新的SSH Key创建 SSH Key:$ ssh-keygen -t rsa -C "[email protected]"
.ssh
目录里面有 id_rsa
和 id_rsa.pub
两个文件,这两个就是 SSH Key 的秘钥对,id_rsa
是私钥,不能泄露出去,id_rsa.pub
是公钥,可以放心地告诉任何人在 GitHub 中配置 SSH Key:
id_rsa.pub
文件的内容进入下一级目录:$ cd
返回上一级目录:$ cd ..
进入到本地用户目录:$ cd ~
创建一个新目录:$ mkdir
显示当前目录在本地的地址:$ pwd
显示目录中的文件:
$ ls
$ ll
$ ls -ah
移动目录:$ mv dir-1 dir-2
重命名目录:$ mv old new
删除空目录:$ rmdir
删除目录:$ rm -r
创建一个文件:$ touch
$ touch example.txt
移动文件:$ mv example.txt dir
重命名文件:$ mv old.txt new.txt
复制文件:$ cp new.txt ./dir
查看文件内容:
$ cat
$ head
$ tail
查看文件的开头几行内容:$ head -3
查看文件的倒数几行内容:$ tail -f -n 3
删除文件:
只删除工作区的文件:$ rm
add
命令将删除操作添加到暂存区同时删除工作区和暂存区的文件:$ git rm
覆盖文件内容:$ echo "content" >
追加内容到文件末尾:$ echo "content" >>
文件的重要操作:删除与恢复
删除
$ rm
$ git rm
恢复文件内容,或者撤销删除操作
对文件的修改或者删除操作还在工作区,但是还没有添加到暂存区,恢复文件只需要一步:$ git checkout --
对文件的修改或者删除操作已添加到暂存区,但是还没有提交到版本库,恢复文件需要两步:
$ git reset HEAD
$ git checkout --
如果删除操作已经提交至版本库:那么请使用版本回退
比较工作区和暂存区的文件差异:$ git diff
比较暂存区与最新本地版本库:$ git diff --cached
比较工作区与最新本地版本库:$ git diff HEAD
比较工作区与指定 commit_id
的差异:$ git diff commit_id
比较暂存区与指定 commit_id
的差异:$ git diff --cached commit_id
比较两个 commit-id
之间的差异:$ git diff commit_id commit_id
repository
从已存在的目录新建一个版本库:$ git init
查看工作区与暂存区的内容:$ git status
将操作从工作区添加到暂存区:$ git add
add
命令可以执行多次,将多个操作添加到暂存区将操作从暂存区提交到版本库:$ git commit -m "此次提交说明"
commit
命令可以一次性将暂存区的操作提交至版本库:
git add file1.txt
git add file2.txt
git commit -m "此次提交了两个文件"
撤销工作区的文件修改:$ git checkout --
移除暂存区中文件至未跟踪状态:$ git rm --cached
untracked files
移除暂存区中文件准备提交状态:$ git reset HEAD
撤销上一次提交并将暂存区文件重新提交:$ git commit --amend
$ git commit --amend -m "commit message"
查看提交日志:$ git log
$ git log --oneline
$ git log --pretty=oneline
commit_id
,一行内显示:$ git log --pretty=oneline --abbrev-commit
$ git log --pretty=oneline
git log -p
git log
不能查看已删除的提交日志,即如果进行了版本回退,那么回退版本号之后再提交的日志都不能查看,如要查看全部提交日志,请使用 $ git reflog
查看所有分支的所有提交日志:$ git reflog
commit
和 reset
的操作),包括已经被删除的 commit
记录,git log
则不能查看已经被删除了的 commit
记录查看命令行历史记录:$ history
版本回退:
$ git reset --hard HEAD^
HEAD^
,上上一个版本就是 HEAD^^
,当然往上100个版本写100个^比较容易数不过来,所以写成 HEAD~100
$ git reset --hard commit_id
commit_id
指的是每次提交操作的版本号,使用 $ git log
命令可以查看全部提交操作的版本号,一般取版本号的前 7 位即可reset
有三个参数:--mixed
、--soft
、--hard
--mixed
:使用此参数,暂存区内容会被丢弃,工作区内容保持不变--soft
:使用此参数,暂存区和工作区的内容都保持不变--hard
:使用此参数,工作区和暂存区的内容都会被丢弃remote
查看远程仓库名称:$ git remote
查看远程仓库的详细信息:$ git remote -v
origin [email protected]:your/yourRepos.git (fetch)
origin [email protected]:your/yourRepos.git (push)
查看远程仓库的引用信息:$ git ls-remote
连接远程仓库:
$ git remote add origin [email protected]:your/yourRepos.git
$ git remote add origin https://github.com/your/yourRepos.git
origin
,也可以改成别的取消与远程仓库的连接:$ git remote rm
修改远程仓库地址:$ git remote
推送到远程仓库同时指定默认远程仓库:$ git push -u origin master
master
分支到远程仓库时,加上了 -u
参数,Git 不但会把本地的 master
分支内容推送到远程仓库新的 master
分支,还会把本地的 master
分支和远程的 master
分支关联起来,指定 origin
为默认远程仓库,在以后的推送或者拉取时就可以简化命令。推送到远程仓库:$ git push origin master
origin
的分支 master
推送到远程仓库:$ git push origin
origin
的对应分支。如果当前分支只有一个追踪分支,那么分支名称都可以省略推送本地分支推送到远程仓库的分支:$ git push origin
local-branch
推送到远程仓库的 remote-branch
分支,如果远程仓库没有 remote-branch
分支就会创建新分支,并且接收本地分支的所有提交Git 中从远程的分支获取最新的版本到本地有两个命令:
git fetch
:此命令从服务器上抓取本地没有的数据时,它并不会修改工作目录中的内容。 它只会获取数据然后让你自己合并
git fetch orgin master //将远程仓库的 master 分支下载到本地当前 branch 中
git log -p master ..origin/master //比较本地的 master 分支和 origin/master 分支的差别
git merge origin/master //进行合并
git fetch origin master:temp //从远程仓库 master 分支获取最新,在本地建立 temp 分支
git diff temp //将当前分支和 temp 进行对比
git merge temp //合并 temp 分支到当前分支
git pull
:从远程获取最新版本并 merge
到本地
git pull origin master
上述命令其实相当于 git fetch 和 git merge
比较 fetch
和 pull
:
pull
= fetch
+ merge
fetch
:在 merge
前,我们可以查看更新情况,然后再决定是否合并抓取远程仓库最新的内容:$ git fetch --all
抓取远程分支最新内容到当前分支: git fetch origin
FETCH_HEAD
为对应的远程仓库分支$ git merge origin/
拉取远程仓库分支到当前分支:$ git pull origin
$ git pull origin master
:将远程仓库 origin
的分支 master
拉取到当前分支拉取远程分支到本地指定分支:$ git pull origin
克隆远程仓库:$ git clone [email protected]/your/yourRepos.git
branch
分支:
分支管理:
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
也可以看到分支的合并情况
$ git log --graph
$ git log --graph --pretty=oneline
$ git log --graph --pretty=oneline --abbrev-commit
查看本地分支与其远程跟踪分支(上游分支):git branch -vv
查看 dev
分支有,而 master
分支没有的:$ git log dev ^master
^
表示对应分支没有的提交查看 dev
分支比 master
分支多提交了哪些内容:$ git log master..dev
..
后面的分支比之前的分支多提交了哪些内容不知道谁提交的多谁提交的少,只想知道有什么不同:$ git log dev...master
比较不同时显示出每个提交是在哪个分支上:$ git log --left-right dev...master
<
代表提交在 dev
分支上,>
代表提交在 master
分支上比较本地分支与远程分支的不同:$ git log -p
创建本地新分支:$ git branch new
commit
为参考创建一个新分支 new
,新分支的提交日志与参考的提交日志一致以某次 commit
为参考创建本地新分支:git branch branch_name [commit_id/HEAD/master]
commit
的引用就可以创建远程新分支:$ git push origin new
new
分支,那么就会创建新分支 new
并推送内容切换分支:$ git checkout new
new
创建新分支并切换到新分支:$ git checkout -b new
new
,并切换到此新分支。相当于执行了两条命令:
$ git branch new
$ git checkout new
基于远程分支创建本地分支:$ git checkout -b new origin/new
new
,并切换到新建的分支 new
,并且建立本地分支 new
与远程分支 origin/new
的跟踪关系基于远程分支创建本地分支:$ git checkout --track origin/
建立本地分支和远程分支的关联:$ git branch --set-upstream-to=origin/dev dev
dev
分支与远程 origin/dev
分支的链接merge
合并分支:把当前分支与被合并分支两个分支的最新快照以及二者最近的共同祖先进行三方合并,合并的结果是生成一个新的快照,并提交
合并指定分支到当前分支:$ git merge new
git merge
命令用并于合指定分支到当前分支。比如当前分支是 master
,那么此命令就是将 new
分支合并到 master
上fast forward
模式,在这种模式下,删除被合并分支后,会丢掉分支信息合并远程分支到本地当前分支:$ git merge origin/
合并指定分支到当前分支并且不使用 fast forward
模式:$ git merge --no-ff -m "commit message"
--no-ff
表示强制禁用 fast forward
模式,Git 就会在merge
时生成一个新的 commit
,这样,从分支历史上就可以看出分支信息rebase
详情参阅
Git 中,整合来自不同分支的修改主要有两种方法:merge
以及 rebase
,即合并分支与变基
变基:rebase
命令将提交到某一分支(当前需要变基的分支)上的所有修改都移至另一分支(目标基底)上,就好像“重新播放”一样。
请注意,无论是通过变基,还是通过三方合并,整合的最终结果所指向的快照始终是一样的,只不过提交历史不同罢了。 变基是将一系列提交按照原有次序依次应用到另一分支上,而合并是把最终结果合在一起
执行变基操作后,视需要在目标基底分支上进行合并分支,将目标基底更新
变基的风险,使用变基要用它得遵守一条准则:
将当前分支变基到另一分支(目标基底):$ git rebase master
master
分支,将当前分支的提交整合到 master
分支将从一个分支上创建的分支变基到另一个分支:$ git rebase --onto master server client
client
分支是从server
分支上创建的,只想单独变基 client
分支到 master
分支client
分支,找出处于 client
分支和 server
分支的共同祖先之后的修改,然后把它们在 master
分支上重放一遍快速地进行变基:$ git rebase master server
server
)变基到目标分支(即 master
)上。这样做能省去你先切换到 server
分支,再对其执行变基命令的多个步骤撤销上一次的合并分支:$ git merge --abort
删除当前本地版本库的指定分支:$ git branch -d new
new
,此分支必须是被合并过的分支强制删除未合并过的分支:$ git branch -D
-D
参数删除远程仓库指定分支:
$ git push origin -d
$ git push origin :
stash
储存并隐藏未完结的修改/未提交的修改:$ git stash
commit
的内容隐藏起来,之后在工作区中就是干净的。把当前工作现场“储藏”起来,可以等到以后恢复现场后继续工作查看 stash
储藏的内容:$ git stash list
将 stash
最后一条记录储藏的内容恢复到工作区:$ git stash apply
stash
内容并不删除,你需要用 git stash drop
来删除将指定的 stash
储藏的内容恢复到工作区:$ git stash apply stash@{num}
stash
储藏的内容的第 num
条记录恢复到工作区,num
从 0 开始移除 stash
储藏的内容:$ git stash drop
恢复的同时删除 stash
内容:$ git stash pop
stash
内容记录stash
内容记录tag
标签:tag
是一个让人容易记住的有意义的名字,它跟某个 commit
绑在一起
Git 的标签是版本库的快照,但其实它就是指向某个 commit
的指针(跟分支很像,但是分支可以移动,标签不能移动),所以,创建和删除标签都是瞬间完成的
标签默认是打在分支最新提交的 commit
上的
注意:标签总是和某个 commit
挂钩。如果这个 commit
既出现在 master
分支,又出现在 dev
分支,那么在这两个分支上都可以看到这个标签
查看所有标签:$ git tag
查看指定标签的信息:$ git show
给某个分支打标签:$ git tag
给指定的 commit_id
打上标签:$ git tag
commit_id
来创建标签创建带有说明的标签:$ git tag -a v0.1 -m "version 0.1 released" commit_id
-a
指定标签名,-m
指定说明文字推送某个标签到远程:$ git push origin
一次性推送全部未推送过的本地标签到远程:$ git push origin --tags
因为创建的标签都只存储在本地,不会自动推送到远程。所以,打错的标签可以在本地安全删除
删除本地某个标签:$ git tag -d
删除远程仓库的标签:$ git push origin :refs/tags/
删除远程仓库的标签:$ git push origin -d
设置 ‘Git’ 的用户主目录:
Home
,将路径设置为你想要的路径设置 ‘Git’ 的开始路径:
问题描述:在 ‘Windows’ 下安装 ‘Git’ 后,默认的用户主目录和开始路径一般都是:C:\Users\用户名。但是这并不是你放置 ‘repository’ 的工作目录,不想每次启动 ‘Git Bash’ 或者 ‘Git CMD’ 都要手动进入你的工作目录
解决方式:通过修改快捷方式的路径即可修改默认路径
目 标 : G:\Git\git-bash.exe --cd-to-home
起始位置 : %HOMEDRIVE%%HOMEPATH%
--cd-to-home
G:\Git Workspace
输入 $ git add
后出现警告:
如下
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 无法自动合并分支时,就必须首先解决冲突。解决冲突后,再提交,合并完成。
删除分支出错
显示如下错误信息
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
cd
命令进行目录切换时需要注意目录中的空格:
""
引号将目录名括起来\
加上空格,代替直接输入空格分支合并