学会这些,99.9%的git问题都可以轻松解决

    Git是一款免费并且开源的分布式版本控制系统,旨在快速高效地处理各种大小型项目的内容变更。相比CVSSubVersion等集中式版本控制软件,Git更安全,也更强大。本文要求你有一定的Git基础(曾经用过、知道Git能干什么)。

安装

    一切都要从安装开始,软件安装还是比较简单的。

Linux环境

    Linux环境下一般都是直接使用包管理器进行安装(比如apt-get install gityum install gitdnf install git),具体安装命令参考各自系统所使用的包管理工具。

Windows环境

    Windows环境下可以从官网直接下载对应体系结构(x86【即32位操作系统】还是x64【即64位操作系统】)的Git安装包,安装时可以调整安装目录,其他的配置根据需要做调整。

    个人建议主要调整字符集为UTF-8,并且调整字体为合适的大小。其他配置酌情处理。

学会这些,99.9%的git问题都可以轻松解决
Git配置

基本概念

工作区

    工作区就是执行git init之后的当前目录(排除命令生成的.git目录)。

暂存区

    暂存区为.git目录下的index二进制文件,通过git add ${files}可以将工作区的文件变动写入到暂存区中。

本地库

    .git目录就是Git的本地库,该目录存储了变动历史、远程仓库配置、分配情况、当前分支、当前commitId、操作日志等内容,暂存区也属于本地库的一部分。以下几个文件或者目录可以稍作了解:

学会这些,99.9%的git问题都可以轻松解决
GitDirectory

    index文件我们已经介绍了,就是暂存区(通过也叫做stage);

    config文件是当前Git仓库的配置信息,存储了远程仓库、分支关联关系、本地仓库命令别名等信息;

    HEAD文件指示当前工作区所在的分支信息;

    logs目录存储本地和远程的所有分支变更部分操作日志;

    refs/heads目录下的文件指示当前工作区所在分支的commitId

    refs/remotes目录下的都是远程仓库的信息;

    refs/remotes/origin目录表示该目录下的信息都是远程仓库origin的信息;

    refs/remotes/origin/master指示远程origin仓库的master分支的commitId;同理:refs/remotes/origin/xxx指示远程origin仓库的xxx分支的commitId

    refs/tags目录存储所有当前仓库的标签信息。

其中config配置文件是我们平时用的较多的地方,比如我们通过git remote add ${name} ${url}添加远程仓库时,将会往该文件生成新的[remote "${name}"]配置项;当将本地分支和远程分支关联起来后,同样会在该文件中生成新的[branch "${name}"]配置项。

远程库

    当通过git remote add命令添加远程库之后,就可以将本地库与远程仓库建立关联,一个本地库可以关联到多个远程库,通过名称区分不同的远程库。

操作与状态变更

    通过不同的git命令,内容的变更将会映射到工作区、暂存区、本地分支、远程分支上。参考下图:

学会这些,99.9%的git问题都可以轻松解决
Git操作与状态变更

    当我们添加文件、修改文件或者删除文件后,通过git add命令将工作区的内容变更(包括新增、删除。git实际管理的是变更)写入到暂存区中,写完之后通过git commit命令将暂存区的变更提交到本地分支上,本地分支通过git push命令将本地分支变更推送到远程分支;反过来:通过git pull(或者git fetch结合git merge命令)命令将远程分支拉取并合并到本地分支上,通过git checkout命令可以切换分支,通过git reset HEAD(高版本的git推荐使用git restore --staged)将暂存区的的变更回退到工作区;git checkout --(高版本的git推荐使用git restore)将工作区的变更直接撤销,撤销工作区变更后通常就找不回来了(当然使用IDEA的话有Local History还是有机会找回部分本地记录的)。

    以上操作基本就是我们日常开发中用到的命令中,下面针对一些实际场景分别介绍相应的命令操作。

推送本地库到多个远程库中

    如果我们想要将本地库(也就是项目)目提交到不同的远程库中,以githubgitee为例(也可以是gitee或者github下的两个不同仓库),那么我们首先要在GitHubGitee中分别创建两个新仓库,得到对应的ssh或者https地址,然后在本地通过git remote add ${name} ${url}的方式将远程库配置添加到本地库中。比如:git remote add github https://github.com/xxx/demo.git命令将https://github.com/xxx/demo.gitgithub为名作为远程库添加到本地库中;添加完毕后,可以通过git remote -v命令查看当前仓库对应的所有远程库信息。

学会这些,99.9%的git问题都可以轻松解决
Git远程库信息

    随后在推送变更的时候,通过指定远程库名称的方式进行推送,比如:git push gitee ${lb}:${rb}或者git push github ${lb}:${rb}的将本地的lb分支推送到远程gitee或者githubrb分支。

    如果每次提交都要同步到两个远程库,那么使用这种方法会导致提交必须执行两次,这时候可以考虑使用git remote set-url --add ${name} ${url}命令扩展远程库的地址,这样每次push的时候都会同时提交到不同地址的远程库中。

学会这些,99.9%的git问题都可以轻松解决
Git远程库多地址

    参考上图,origin远程库的push地址有两次,这样每次通过git push origin ${lb}:${rb}的时候都会将本地分支同时推送到githubgitee上。

修改本地提交的备注信息

    通过git commit -m "${message}"执行提交之后,有时候会发现提交的备注信息不完整或者不正确,这时候可以通过git commit --amend命令进入修改页面,并修改最新的提交记录。「注意只能是修改最新的提交记录,如果是往前N个提交的备注是无法修改的。」

学会这些,99.9%的git问题都可以轻松解决
Git修改提交信息

    该页面里以#开头的都是注释,最终不会作为备注信息记录到提交中,修改完之后切换到末行模式输入wq或者x保存本次修改并回到工作区。(「同时注意该命令只能在工作区执行,在本地库目录.git下无法执行」

分支关联

    如果我们不把本地分支与远程分支进行关联,那么每次提交的时候我们都需要通过git push ${remote} ${lb}:${rb}指定分支关联关系以确保分支关联正确(如果本地和远程分支名称一致,可以省略:${rb})。但是如果我们关联了本地和远程的分支关系,那么就可以直接通过git push直接推送到当前本地分支关联的远程分支上。

    通过git branch -vv可以查看到当前分支与远程分支的关联关系。

    有以下几个命令可以将本地与远程分支关联起来:

    如果本地分支存在:

  • git branch –set-upstream {remote}/${rb}(高版本Git已废弃该命令,不可使用)
  • git branch –set-upstream-to={rb} ${lb:默认当前本地分支,可忽略}
  • git branch -u {rb} ${lb:默认当前本地分支,可忽略}

    如果本地分支不存在:

  • git branch –track ${lb} ${remote}/${rb} (此时会自动创建本地分支,我们只需要通过checkout切换即可)

    关联之后,再次使用git branch -vv可以看到用中括弧指示的远程分支信息,包括提交是否超前/滞后多少个版本;同时此时使用git status的时候有比较完整的提示信息。

学会这些,99.9%的git问题都可以轻松解决
Git分支关联

命令别名与配置文件

    Git部分命令名称比较长(比如:cherry-pickcommit等),尽管可以通过tab获取命令快捷提示,但是使用别名是另一种更高效的做法,Git的别名通常通过git config alias.${alias} "${command}"命令完成配置,默认别名配置在当前仓库生效,如果想要全局生效,那么需要在git config后面添加--global选项。这里提供一下笔者当前的别名配置列表:

[alias]
lg = log --color --graph --pretty=format:'%Cred%h%Cresetn-%C(yellow)%d%Creset %s %Cgreen(%cr) %C(bold blue)<%an>%Creset' --abbrev-commit
lgr = log --color --pretty=format:'%Cred%h%Cresetn-%C(yellow)%d%Creset %s %Cgreen(%cr) %C(bold blue)<%an>%Creset' --abbrev-commit --reverse
st = status
co = checkout
ci = commit
br = branch
revoke = checkout --
cm = commit -m
df = diff
bm = branch -m
bd = branch -D
ls = log --stat
lp = log -p
cb = checkout -b
mg = merge
fe = fetch
mn = merge --no-ff
dt = difftool
dty = difftool -y
ss = stash save
sl = stash list
sa = stash apply
cp = cherry-pick

    由于别名较多,并且这些通常是各个仓库共用的,因此建议通过--global选项添加到全局配置中。更好的做法是直接vim ~/.gitconfig,然后将这些配置复制进去。~/.gitconfiggit的全局配置文件,该文件下里的配置对所有本地库都生效(包括访问代理、密码存储器等)。

学会这些,99.9%的git问题都可以轻松解决
Git全局配置

    配置完毕后实时生效,此时执行git st相当于执行git status,执行git cm 'CommitMessage'相当于执行git commit -m 'CommitMessage'(即可以通过拼接其他内容参与命令执行),其中git lg会打印出一张漂亮的提交历史图谱。

    经过以上这些操作之后,我们也可以回过头看一眼.git/config配置文件的信息:

学会这些,99.9%的git问题都可以轻松解决
Git本地配置

    我们完成可以通过直接编辑该文件来达到与命令一致的效果,具体方式需结合场景使用,比如批量别名的话直接编辑文件一般更合适。

    限于篇幅原因,log日志、stash驻留区、diff差异比较、reset的三种效果、rebase变基等命令将在后续篇章中一一介绍。


原文始发于微信公众号(三维家技术实践):学会这些,99.9%的git问题都可以轻松解决

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/30667.html

(0)
小半的头像小半

相关推荐

发表回复

登录后才能评论
极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!