写作目的:
Git的命令很多,现在常用的几个我们能记得,但是不常用的真的会忘记,尤其是随着可视化工具的使用,难免会有我们急需使用却又不记得的命令,这片文章算是学习及工作的笔记,便于回头查看。
看本篇文章的目的:
对于新手伙伴算是一篇对 Git 理解及操作的指南,基本的操作看这一篇就够了。对于有 Git 使用经验的伙伴,空闲时可用于操作回顾,也可作为基本命令的快速查找文档。
官方解释:
Git是一个免费的开源分布式版本控制系统,旨在快速高效地处理从小型到大型项目的所有事务。
翻译成易于我们理解的解释:
GIt 管理的是文件的改动,我们们可以理解为,文件改动是一个动作,这个动作会产生一个结果,即:改动的内容。如果我们将每一次改动之后的内容都作为一个版本,那么Git就会将此次的改动内容记录在一个版本号下。这个版本我们可以理解为已经存为了一个快照,不管后来文件再怎么更改,我们都可以通过版本号随时查看及回到这个版本。这样Git 就实现了版本控制。
Windows
打开Git官网链接https://git-scm.com/downloads,点击对应系统的链接下载,安装之后,随便在某个文件下右键如果有Git Bash Here就安装成功。安装后,还要在命令行输入
git config --global user.name “your name”
git config --global user.email “your email”
Mac
git init. 始化,表示把这个文件变成Git可以管理的仓库。初始化后打开隐藏的文件可以看到有一个.git文件。
git add . 后面的一个点表示把这个文件全部提交到暂存区。git add ./readme.md/ 表示把这个文件下面的readme.md文件提交到暂存区。
git commit -m "对本次commit的描述" git commit 的意思是把暂存区的全部文件提交到本地仓库。-m后添加对本次commit的描述。
git remote add origin https://github.com/name/name_repository.git 表示把你本地的仓库与GitHub上的远程仓库连接起来。只需要连接一次,以后提交的时候就可以不用写这条命令了。name 是你的github名字,name_repository 是你的仓库名。注意带着.git后缀。
git push -u origin master 把本地仓库提交到远程仓库。在你的远程仓库上刷新一下就可以看到你提交的文件了。
注意: 在 git commit -m "" 之前,可以重复 git add 到暂存区。 git commit 会把你之前存放在暂存区的全部文件汇总一次性全部提交到本地仓库。
对于文件的改动,每次提交,Git会把他们串成一条时间线。我们想要回到某次提交的版本,使用 git reset --hard + 版本号 命令。 版本号可以使用 git log 命令来查看,每次提交都有对应的版本号。回溯之后,git log 查看一下发现离我们最近的那个版本已经不见了。如果还想要前进到最近的版本,使用 git reset --hard + 版本号 就行。虽然我们可以通过 git reset --hard + 版本号 ,靠记住版本号来可以在不同的版本之间来回穿梭。但如果我们的版本号不记得了,git reflog 记录了每一次的命令,这样就可以找到版本号了,又可以通过 git reset 切换版本了。
git checkout -- file。撤销修改就回到和版本库一模一样的状态,即用版本库里的版本替换工作区的版本。git reset --hard + 版本号 ,再 git checkout -- file ,替换工作区的版本。git add 一个文件到暂存区,然后在工作区又把文件删除了,Git会知道你删除了文件。如果你要把版本库里的文件删除,git rm 并且 git commit -m "xxx".git checkout -- 就可以。再次证明了撤销命令其实就是用版本库里的版本替换工作区的版本,无论工作区是修改还是删除,都可以“一键还原”。在没有其他分支插进来时,只有一个master主分支。每次你git push -u origin master 提交就是增加一条时间轴,master也会跟着移动。创建一个other的分支,通过other提交,虽然时间轴向前走了,但是主分支master还在原来的位置。
// 创建分支other,切换到other分支。
git branch other
git checkout other
// 查看当前所有分支
git branch
// 合并分支
git merge other
// 删除分支
git branch -d other
//查看分支合并图
git log --graph
git merge --no-ff other 禁用 Fast forward 模式,因为使用 Fast forward模式,删除分支后,分支历史信息会丢失。
工作中每个bug都可以通过一个新的临时分支来修复,修复后,合并分支,然后将临时分支删除。但如果你手上有分支在工作中,你的上级要你改另外的分支的BUG。你要把现在正在工作的分支保存下来,git stash,把当前工作现场“存储”起来,等以后恢复后继续工作。当你解决BUG后,git checkout other回到自己的分支。用git stash list查看你刚刚“存放”起来的工作去哪里了。此时你要恢复工作:
git stash apply 恢复却不删除stash内容,git stash drop删除stash内容。
git stash pop 恢复的同时把stash内容也删了.
此时,用git stash list查看,看不到任何stash 内容。
总结: 修复bug时,我们会通过创建新的bug分支进行修复,然后合并,最后删除;当手头工作没有完成时,先把工作现场 git stash 一下,然后去修复bug,修复后,再 git stash pop ,回到工作现场
git branch -d + 分支 有可能会删除失败,因为Git会保护没有被合并的分支。git branch -D + 分支 强行删除,丢弃没被合并的分支。git remote 查看远程库的信息,会显示origin,远程仓库默认名称为origingit remote -v 显示更详细的信息git push -u origin master 推送master分支到origin远程仓库。git push -u origin other 推送other到origin远程仓库。推送分支产生冲突时:
git pull 把最新的提交从远程仓库中抓取下来,在本地合并,解决冲突。再进行git push。
如果git pull 也失败了,还要指定分支之间的链接,这一步Git会提醒你怎么做。然后再git push。
git push origin 推送自己的修改;git pull试图合并;git push origin 推送就能成功git pull提示no tracking information,则说明本地分支和远程分支的链接关系没有创建,用命令git branch --set-upstream-to origin/ 。git rebase 把分叉的提交历史“整理”成一条直线,看上去更直观.缺点是本地的分叉提交已经被修改过了。git push -u origin master rebase的目的是使得我们在查看历史提交的变化时更容易,因为分叉的提交需要三方对比。比如一个APP要上线,通常在版本库中打一个标签(tag),
这样,就确定了打标签的版本。将来无论什么时候,取某个标签的版本,就是把那个打标签的时刻的历史版本取出来。所以,标签也是版本库的一个快照。
Git的标签虽然是版本库的快照,但其实它就是指向某个commit的指针。
tag其实就是一个让人容易记住的有意义的名字,它跟某个commit绑在一起。比如tag v2.1就是把历史上的一个版本的东西叫做v2.1
步骤:
git branch 查看当前分支, git checkout master 切换到master分支。git tag 打标签,默认为HEAD。比如 git tag v1.0git log找到历史提交的commit id.git tag 查看所有标签,可以知道历史版本的taggit show 查看标签信息。git tag -a <标签名> -m "<说明>", 创建带说明的标签。 -a指定标签名,-m指定说明文字。用show可以查看说明。git tag -d v1.0 删除标签。因为创建的标签都只存储在本地,不会自动推送到远程。所以,打错的标签可以在本地安全删除。git push origin 推送某个标签到远程git push origin --tags 一次性推送全部尚未推送到远程的本地标签git push origin :refs/tags/v1.0 删除远程标签v1.0git config --global color.ui true 让Git显示颜色,会让命令输出看起来更醒目忽略文件原则:忽略操作系统自动生成的文件,比如缩略图等;
忽略编译生成的中间文件、可执行文件等,也就是如果一个文件是通过另一个文件自动生成的,那自动生成的文件就没必要放进版本库,比如Java编译产生的.class文件;忽略你自己的带有敏感信息的配置文件,比如存放口令的配置文件。
git add -f git check-ignore -v 检查为什么Git会忽略该文件。git rebase时,你给它一个“外号”,就叫它git reb。以后你可以通过git reb来代替git rebase。git config --global user.name "你的名字" 让你全部的Git仓库绑定你的名字git init 初始化你的仓库git add . 把工作区的文件全部提交到暂存区git add .// 把工作区的文件提交到暂存区git commit -m "xxx" 把暂存区的所有文件提交到仓库区,暂存区空空荡荡git remote add origin https://github.com/name/name_cangku.git 把本地仓库与远程仓库连接起来git push -u origin master 把仓库区的主分支master提交到远程仓库里git push -u origin <其他分支> 把其他分支提交到远程仓库git status 查看当前仓库的状态git diff 查看文件修改的具体内容git log 显示从最近到最远的提交历史git clone + 仓库地址下载克隆文件git reset --hard + 版本号 回溯版本,版本号在commit的时候与master跟随在一起git reflog 显示命令历史git checkout -- 撤销命令,用版本库里的文件替换掉工作区的文件。我觉得就像是Git世界的ctrl + zgit rm 删除版本库的文件git branch 查看当前所有分支git branch <分支名字> 创建分支git checkout <分支名字> 切换到分支git merge <分支名字> 合并分支git branch -d <分支名字> 删除分支,有可能会删除失败,因为Git会保护没有被合并的分支git branch -D + <分支名字> 强行删除,丢弃没被合并的分支git log --graph 查看分支合并图git merge --no-ff <分支名字> 合并分支的时候禁用Fast forward模式,因为这个模式会丢失分支历史信息git stash 当有其他任务插进来时,把当前工作现场“存储”起来,以后恢复后继续工作git stash list 查看你刚刚“存放”起来的工作去哪里了git stash apply 恢复却不删除stash内容git stash drop 删除stash内容git stash pop 恢复的同时把stash内容也删了git remote 查看远程库的信息,会显示origin,远程仓库默认名称为origingit remote -v 显示更详细的信息git pull 把最新的提交从远程仓库中抓取下来,在本地合并,和git push相反git rebase 把分叉的提交历史“整理”成一条直线,看上去更直观git tag 查看所有标签,可以知道历史版本的taggit tag 打标签,默认为HEAD。比如git tag v1.0git tag <版本号> 把版本号打上标签,版本号就是commit时,跟在旁边的一串字母数字git show 查看标签信息git tag -a -m "<说明>" 创建带说明的标签。 -a指定标签名,-m指定说明文字git tag -d 删除标签git push origin 推送某个标签到远程git push origin --tags 一次性推送全部尚未推送到远程的本地标签git push origin :refs/tags/ 删除远程标签git config --global color.ui true 让Git显示颜色,会让命令输出看起来更醒目git add -f 强制提交已忽略的的文件git check-ignore -v 检查为什么Git会忽略该文件建议平时的开发工作中使用可视化工具进行git操作,方便又不易于出错,但是不要完全依赖于这些工具,对于常用的命令我们还是应该理解并记住,或者能有一个地方尽快查到,这样才不会受到这些工具的限制。