Git 是一个开源的分布式版本控制系统(VCS),也是个内容管理系统(CMS),可以高效地处理各种项目。
以下是 Git 的基本命令和对应操作内容的示意图:
域
新建的一个 git项目,会在项目根目录下创建一个隐藏的 .git
目录,用于存放 git 所需信息。当我们变更项目文件时是不会直接作用于 git 的,需要相关命令才能触发相应操作。一般也将 .git
目录 称之为 版本库。
域 | 说明 |
---|---|
Remote |
远程仓库。 |
Repository |
仓库区(或本地仓库),存于 .git 目录 。 |
Index / Stage |
暂存区,即缓存,存于 .git/index 文件。 |
Workspace |
工作区,可视的,直接操作的目录。 |
常用操作
1 | 查看帮助 |
操作命令 | 说明 |
---|---|
git clone |
克隆远程仓库到本地,包括了工作区和版本库 。 |
git pull |
拉取远程仓库到本地,并合并。相当于 git fetch + git merge 。 |
git add |
添加变动到暂存区。 |
git commit |
提交变动到本地仓库。 |
git push |
发布(publish)到远程仓库。 |
git checkout |
切换分支。git checkout 前,确保已 commit 。 |
git merge |
合并分支。 |
git 的部分命令可能会调用 vim 文本编辑器,这里列举一些常用操作:
vim 涉及 | 说明 |
---|---|
/ |
输入字符即可查询。输入n 查看下一个匹配项。 |
i |
切换光标为输入/替换模式,光标将变成竖线/下划线。 |
Esc |
退出当前模式。 |
shift + : |
进入底线命令模式。此时 q 为退出, w 为保存,! 为强制,可以叠加。 |
获取和初始化项目
git init
1 | 在当前目录新建一个Git代码库 |
1 | 新建一个目录,将其初始化为Git代码库 |
git clone
1 | 下载项目和默认分支的代码历史 |
基本快照
Git 的工作就是创建和保存你项目的快照及与之后的快照进行对比。这里将对操作项目快照的命令作介绍。
git add
1 | 新建文件 |
git status
1 | 显示有变更的文件状态(未commit的文件) |
git diff
1 | 显示暂存区与工作区的差异(只针对暂存区已存在的文件) |
git commit
1 | 提交暂存区到仓库区 |
1 | 使用一次新的commit,替代上一次提交 |
git log
1 | 显示commit日志 |
1 | 展示当前版本树 |
git rm
/ git mv
1 | 删除工作区文件,并且将这次删除放入暂存区 |
1 | 重命名文件,并且将这个改名放入暂存区 |
高级操作
这些命令可能会具有一定的风险,请确保了解后再使用。
git reset
重置(后退)完成,依然可以通过
git reflog
查看hash,并撤销重置(前进)。
1 | 重置暂存区与工作区,与上一次commit保持一致 |
1 | 重置当前分支的指针为指定commit,同时重置暂存区,但工作区不变 |
如果以提交到远程库,需要强行推送
1 | 强行推送当前分支到远程仓库,即使有冲突 |
git reflog
1 | 查看参考日志(包括重要的操作信息和对应hash) |
git cherry-pick
当我们只想获得某分支的某个功能, 可以通过 cherry-pick
来直接提取某个或某几个提交 。
这个功能可以弥补多个大分支开发下,
merge
的不足。
1 | 提取某个提交 |
共享和更新项目
git remote
如果项目是
git clone
下来的会自带连接的远程仓库。
1 | 为本地仓库设置远程仓库origin |
git fetch
1 | 下载远程仓库的所有变动 |
git pull
git pull
相当于git fetch
+git merge
。
1 | 拉取远程仓库的变化,并与本地当前分支合并 |
git push
HEAD
是一个游标,一般表示当前分支。
1 | 推送当前本地分支到远程仓库 |
1 | 推送所有分支到远程仓库 |
分支和合并
使用分支意味着你可以从开发主线上分离开来,然后在不影响主线的同时继续工作。
git branch
1 | 列出所有远程分支:$ git branch -r |
1 | 新建一个分支,指向指定commit |
git checkout
git checkout
是个很危险的命令,不管是切换分支或文件,请确保已 commit
,否则可能会丢失文件记录等。
当两个分支的最新 commit 的散列码不相同时,若存在未 commit 文件,cheout 时会失败并提示;
当两个分支的最新 commit 的散列码相同时,cheout 时,未 commit 的文件会带入当另一个分支中。
1 | 切换到指定分支,并更新工作区 |
1 | 新建一个分支,并切换到该分支 |
git merge
1 | 合并指定分支到当前分支 |
git tag
如果你达到一个重要的阶段,并希望永远记住这个特别的提交快照,你可以使用 git tag
给它打上标签。
1 | 仅添加标签: |
常用开发方案
.gitignore
在 .gitignore
文件中配置的文件不会被 Git 管理。
1 | *.class |
常见问题
多账号配置
一般个人和工作需要使用不同的 git 账号。这里使用不同的 ssh-key
来对应不同的 HostName
。
1 | ssh-keygen -t rsa -C "personal@mail.com" |
因为修改了默认名称,所有需要手动添加秘钥。
避免每次重启后都需要手动添加(Mac)
- 自动操作(应用程序) -> Shell脚本 -> 添加以下命令
- 用户与群组 -> 登录项添加
1 | ssh-add ~/.ssh/id_rsa_personal |
在 ~/.ssh
下配置 config
文件
1 | Host github |
测试配置是否成功
1 | ssh -T git@github.com |
1 | 取消全局用户名和邮箱 |