Git 是近年来被广泛采用的版本控制系统工具,主要因为 Git 可以同时处理本地和远程源代码管理,而且非常适合团队协作开发。使用 Git,用户可以轻松地跟踪文件的变化、回退到历史版本、分支管理、合并代码等操作,非常方便。Debian 能够提供免费的 Git 服务,本文将介绍一些Debian的Git相关配置。
一、Git软件包
git 相关包和命令列表:
软件包 | 流行度 | 大小 | 命令 | 说明 |
git | V:345, I:547 | 46734 | git(7) | Git 快速、可扩展、分布式的版本控制系统 |
gitk | V:5, I:34 | 1838 | gitk(1) | 有历史功能的 Git 图形仓库浏览器 |
git-gui | V:1, I:18 | 2429 | git-gui(1) | Git 图形界面(无历史功能) |
git-email | V:0, I:10 | 1087 | git-send-email(1) | 从 Git 用电子邮件发送收集到的补丁 |
git-buildpackage | V:1, I:9 | 1988 | git-buildpackage(1) | 用 Git 自动制作 Debian 包 |
dgit | V:0, I:1 | 484 | dgit(1) | Debian 档案库的 git 交互操作 |
imediff | V:0, I:0 | 169 | git-ime(1) | 交互式的分开 git 提交的辅助工具 |
stgit | V:0, I:0 | 601 | stg(1) | 封装的 git (Python) |
git-doc | I:12 | 13208 | N/A | Git 官方文档 |
gitmagic | I:0 | 721 | N/A | Git 魔术,易于理解的 Git 手册 |
二、配置Git客户端
可以在 “~/.gitconfig” 里面设置几个 Git 接下来需要使用的全局配置,比如说名字和电子邮件地址。
$ git config --global user.name "Name Surname" $ git config --global user.email yourname@example.com
也可以按如下所示定制 Git 的默认行为。
$ git config --global init.defaultBranch main $ git config --global pull.rebase true $ git config --global push.default current
如果习惯使用 CVS 或 Subversion 命令,也许希望设置如下几个命令别名。
$ git config --global alias.ci "commit -a" $ git config --global alias.co checkout
能够通过如下方式检查全局配置:
$ git config --global --list
三、基本Git命令
Git 操作涉及以下几个数据:
1、工作树目录保持面向用户的文件,可以对这些文件做修改。需要被记录的改变,必须明确的被选择并暂存到索引。这是 git add 和 git rm 命令。
2、索引保持暂存文件。在接下来的请求之前,暂存文件将被提交到本地仓库。这个是 git commit 命令。
3、本地仓库保持已经提交的的文件。
- Git 记录提交数据的链接历史并在仓库里面将它们作为分支组织;
- 本地仓库通过 git push 命令发送数据到远程仓库;
- 本地仓库能够通过 git fetch 和 git pull 命令从远程仓库接收数据;
- git pull 命令在 git fetch 后执行 git merge 或 git rebase 命令;
- 这里,git merge 联合两个独立分支的历史结尾到一个点;(在没有定制的 git pull ,这个是默认的,同时对上游作者发布分支到许多人时,也是好的 )
- 这里,git rebase 创建一个远程分支的序列历史的单个分支,跟着本地分支。(这是定制 pull.rebase true 的情况,对我们其余的用途有用。)
4、远程仓库保持已经提交的文件。到远程仓库的通信,使用安全的通信协议,比如 SSH 或 HTTPS。
工作树是在 .git/ 目录之外的文件。在 .git/ 目录里面的文件,包括索引、本地仓库数据和一些 git 配置的文本文件。
这里是主要的 Git 命令概览:
Git 命令 | 功能 |
---|---|
git init |
创建(本地)存储库 |
git clone URL |
克隆远程存储库到本地仓库工作目录树 |
git pull origin main |
通过远程仓库 origin 更新本地 main 分支 |
git add . |
增加工作树里面的文件仅作为预先存在的索引文件 |
git add -A . |
增加工作树里面的所有文件到索引(包括已经删除的) |
git rm filename |
从工作树和索引中删除文件 |
git commit |
提交在索引中的暂存改变到本地存储库 |
git commit -a |
添加工作树里的所有的改变到索引并提交它们到本地仓库(添加 + 提交) |
git push -u origin branch_name |
使用本地 branch_name 分支更新远程仓库 origin (初始启用) |
git push origin branch_name |
使用本地 branch_name 分支更新远程仓库 origin (随后调用) |
git diff treeish1 treeish2 |
显示 treeish1 提交和 treeish2 提交的不同 |
gitk |
VCS 存储库分支历史树的图形界面显示 |
四、Git技巧
下面是一些 Git 技巧:
Git 命令行 | 功能 |
---|---|
gitk --all |
参看完整的 Git 历史和操作,比如重置 HEAD 到另外一个提交、挑选补丁、创建标签和分支…… |
git stash |
得到一个干净的工作树,不会丢失数据 |
git remote -v |
检查远程设置 |
git branch -vv |
检查分支设置 |
git status |
显示工作树状态 |
git config -l |
列出 git 设置 |
git reset --hard HEAD; git clean -x -d -f |
反转所有工作树的改变并完全清理它们 |
git rm --cached filename |
反转由 git add filename 改变的暂存索引 |
git reflog |
获取参考日志(对从删除的分支中恢复提交有用) |
git branch new_branch_name HEAD@{6} |
从 reflog 信息创建一个新的分支 |
git remote add new_remote URL |
增加一个由 URL 指向的远程仓库 new_remote |
git remote rename origin upstream |
远程仓库的名字从 origin 重命名到 upstream |
git branch -u upstream/branch_name |
设置远程跟踪到远程仓库 upstream 和它的分支名 branch_name 。 |
git remote set-url origin https://foo/bar.git |
改变 origin 的 URL |
git remote set-url --push upstream DISABLED |
禁止推送到 upstream (编辑 .git/config 来重新启用) |
git remote update upstream |
获取 upstream 仓库中所有远程分支更新 |
git fetch upstream foo:upstream-foo |
创建本地(可能是孤立的)upstream-foo 分支,作为upstream 仓库中 foo 分支的一个拷贝 |
git checkout -b topic_branch ; git push -u topic_branch origin |
制作一个新的 topic_branch 并把它推送到 origin |
git branch -m oldname newname |
本地分支改名 |
git push -d origin branch_to_be_removed |
删除远程分支(新的方式) |
git push origin :branch_to_be_removed |
删除远程分支(老的方式) |
git checkout --orphan unconnected |
创建一个新的 unconnected 分支 |
git rebase -i origin/main |
从 origin/main 重新排序、删除、压缩提交到一个干净的分支历史 |
git reset HEAD^; git commit --amend |
压缩最后两个提交为一个 |
git checkout topic_branch ; git merge --squash topic_branch |
压缩整个 topic_branch 到一个提交 |
git fetch --unshallow --update-head-ok origin '+refs/heads/*:refs/heads/*' |
反转一个浅克隆到一个所有分支的完整克隆 |
git ime |
分开最后的提交到一系列单个逐一文件的小提交。(要求 imediff ) |
git repack -a -d; git prune |
本地仓库重新打包到一个单独的包中(这可能限制从删除分支里面恢复丢失数据等机会) |
注意:
- 不要使用带空格的标签字符串。即使一些工具,如 gitk(1) 允许使用它,但会阻碍其它 git 命令;
- 如果一个本地分支推送到一个已经变基或者压缩过的仓库,推送这样的分支有风险,并要求 –force 选项。这通常对 main 分支来说不可接受,但对于一个移植到 main 分支前的特定分支,是可以接受的;
- 从命令行通过 “git-xyz” 直接调用 git 子命令的方式,从 2006 年早期开始就被取消。
如果有一个可执行文件 git-foo 在路径环境变量 $PATH 里面,在命令行输入没有中划线的 “git foo”,则将调用 git-foo.这是 git 命令的一个特性。
五、其它的版本控制系统
版本控制系统(VCS )有时被认为是修订控制系统 (RCS), 或者是软件配置管理程序 (SCM)。
这里是 Debian 系统上著名的其它非 Git 的 VCS 汇总:
软件包 | 流行度 | 大小 | 工具 | VCS 类型 | 描述 |
mercurial | V:4, I:33 | 2019 | Mercurial | 分布式 | mercurial 主要是用 Python 写的还有一部分是 C 写的 |
darcs | V:0, I:5 | 34070 | Darcs | 分布式 | 有智能代数补丁的 DVCS(慢) |
bzr | I:8 | 28 | GNU Bazaar | 分布式 | 受 tla 启发并且是用 Python 写的 DVCS (历史) |
tla | V:0, I:1 | 1022 | GNU arch | 分布式 | 主要由 Tom Lord 写的 DVCS (成为历史的) |
subversion | V:12, I:74 | 4837 | Subversion | 远程 | ”比 CVS 做的好“,远程 VCS 的新标准(历史) |
cvs | V:4, I:30 | 4753 | CVS | 远程 | 以前的远程 VCS 标准(历史) |
tkcvs | V:0, I:1 | 1498 | CVS, … | 远程 | VCS (CVS,Subversion,RCS) 存储库树的图形界面显示 |
rcs | V:2, I:13 | 564 | RCS | 本地 | 比 Unix SCCS 做的好(历史) |
cssc | V:0, I:1 | 2044 | CSSC | 本地 | Unix SCCS 的克隆(历史) |