Git
是一款免费并且开源的分布式版本控制系统,旨在快速高效地处理各种大小型项目的内容变更。相比CVS
和SubVersion
等集中式版本控制软件,Git
更安全,也更强大。本文要求你有一定的Git
基础(曾经用过、知道Git
能干什么)。
安装
一切都要从安装开始,软件安装还是比较简单的。
Linux环境
Linux
环境下一般都是直接使用包管理器进行安装(比如apt-get install git
、yum install git
、dnf install git
),具体安装命令参考各自系统所使用的包管理工具。
Windows环境
Windows
环境下可以从官网直接下载对应体系结构(x86
【即32
位操作系统】还是x64
【即64
位操作系统】)的Git
安装包,安装时可以调整安装目录,其他的配置根据需要做调整。
个人建议主要调整字符集为UTF-8
,并且调整字体为合适的大小。其他配置酌情处理。

基本概念
工作区
工作区就是执行git init
之后的当前目录(排除命令生成的.git
目录)。
暂存区
暂存区为.git
目录下的index
二进制文件,通过git add ${files}
可以将工作区的文件变动写入到暂存区中。
本地库
.git
目录就是Git
的本地库,该目录存储了变动历史、远程仓库配置、分配情况、当前分支、当前commitId
、操作日志等内容,暂存区也属于本地库的一部分。以下几个文件或者目录可以稍作了解:

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
命令,内容的变更将会映射到工作区、暂存区、本地分支、远程分支上。参考下图:

当我们添加文件、修改文件或者删除文件后,通过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
还是有机会找回部分本地记录的)。
以上操作基本就是我们日常开发中用到的命令中,下面针对一些实际场景分别介绍相应的命令操作。
推送本地库到多个远程库中
如果我们想要将本地库(也就是项目)目提交到不同的远程库中,以github
和gitee
为例(也可以是gitee
或者github
下的两个不同仓库),那么我们首先要在GitHub
和Gitee
中分别创建两个新仓库,得到对应的ssh
或者https
地址,然后在本地通过git remote add ${name} ${url}
的方式将远程库配置添加到本地库中。比如:git remote add github https://github.com/xxx/demo.git
命令将https://github.com/xxx/demo.git
以github
为名作为远程库添加到本地库中;添加完毕后,可以通过git remote -v
命令查看当前仓库对应的所有远程库信息。

随后在推送变更的时候,通过指定远程库名称的方式进行推送,比如:git push gitee ${lb}:${rb}
或者git push github ${lb}:${rb}
的将本地的lb
分支推送到远程gitee
或者github
的rb
分支。
如果每次提交都要同步到两个远程库,那么使用这种方法会导致提交必须执行两次,这时候可以考虑使用git remote set-url --add ${name} ${url}
命令扩展远程库的地址,这样每次push
的时候都会同时提交到不同地址的远程库中。

参考上图,origin
远程库的push
地址有两次,这样每次通过git push origin ${lb}:${rb}
的时候都会将本地分支同时推送到github
和gitee
上。
修改本地提交的备注信息
通过git commit -m "${message}"
执行提交之后,有时候会发现提交的备注信息不完整或者不正确,这时候可以通过git commit --amend
命令进入修改页面,并修改最新的提交记录。「注意只能是修改最新的提交记录,如果是往前N个提交的备注是无法修改的。」

该页面里以#
开头的都是注释,最终不会作为备注信息记录到提交中,修改完之后切换到末行模式输入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
的时候有比较完整的提示信息。

命令别名与配置文件
Git
部分命令名称比较长(比如:cherry-pick
、commit
等),尽管可以通过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
,然后将这些配置复制进去。~/.gitconfig
是git
的全局配置文件,该文件下里的配置对所有本地库都生效(包括访问代理、密码存储器等)。

配置完毕后实时生效,此时执行git st
相当于执行git status
,执行git cm 'CommitMessage'
相当于执行git commit -m 'CommitMessage'
(即可以通过拼接其他内容参与命令执行),其中git lg
会打印出一张漂亮的提交历史图谱。
经过以上这些操作之后,我们也可以回过头看一眼.git/config
配置文件的信息:

我们完成可以通过直接编辑该文件来达到与命令一致的效果,具体方式需结合场景使用,比如批量别名的话直接编辑文件一般更合适。
限于篇幅原因,log
日志、stash
驻留区、diff
差异比较、reset
的三种效果、rebase
变基等命令将在后续篇章中一一介绍。
原文始发于微信公众号(三维家技术实践):学会这些,99.9%的git问题都可以轻松解决
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/30667.html