备注:以#开头的行用于注释说明,不需要输入
环境安装
(1)Linux下安装
$ sudo apt-get install git
$ git --version
git version 2.25.1
(2)Windows下安装
从官方网站下载合适的Git版本,下载完成后双击安装包,按照向导一步步安装即可,安装完成之后选择Git Bash可以启动Git命令行。
$ git --version
git version 2.6.4.windows.1
图形界面
Git自带两个可视化工具gitk和git-gui,gitk用于查看提交历史,git-gui用于制作提交。此外,Git官方网站整理了一份比较流行的GUI工具清单,Windows上推荐GitHub Desktop、SourceTree、TortoiseGit和Git Extensions。
用户设置
# 通过--local可以为每个仓库设置不同的用户信息
$ git config --global user.name "leitiannet" # 设置用户姓名
$ git config --global user.email "347341200@qq.com" # 设置用户邮箱
$ git config --list # 查看所有设置
创建仓库
$ mkdir git-practice # 创建目录
$ cd git-practice # 进入目录
$ git init # 初始化目录,自动创建.git隐藏目录(Git版本控制的核心)
Initialized empty Git repository in C:/home/github/project/git-practice/.git/
# git init git-practice # 初始化指定目录(如果目录不存在,则自动创建目录)
暂存更改
$ echo "# git-practice" >> README.md # 创建文件
$ mkdir images && touch images/.keep # 创建目录,通过创建一个“.keep”或“.gitkeep”的空文件让Git感知目录存在(空目录无法提交)
$ git add README.md images/.keep # 添加文件到暂存区
# git add * # 添加所有文件到暂存区
# git add . # 添加当前目录及其子目录下所有文件到暂存区
# git add --all # 添加所有文件到暂存区
查看更改
$ git status # 查看工作区状态
# git status -s # 查看工作区状态简览
$ git diff # 查看工作区和暂存区的差异---git add
$ git diff --cached HEAD # 查看暂存区和最新提交的差异---git commit
$ git diff HEAD # 查看工作区和最新提交的差异---git commit -a
提交更改
$ git commit -m "init commit" # 将暂存区的内容提交到存储库进行存档(创建一个版本),提交说明用于记录更改的原因(强制性)
说明1:git commit命令只提交暂存区的内容,那些还没有被加到暂存区的文件不会被提交到存储库。因此,git add命令之后修改文件需要重新执行git add命令加到暂存区!!!
说明2:对于新建文件必须使用git add和git commit二段式提交(避免因频繁改动产生过多提交,不方便查看提交历史),对于更新文件或删除文件可以使用git commit -a一段式提交(快速提交)。
$ git commit -m "update commit" -a # 自动暂存已追踪文件并提交到存储库进行存档,从而跳过git add(对新建文件是无效的)
提交历史
$ git log # 查看所有提交(按时间逆序):提交SHA-1哈希值(commitid)、作者、提交日期、提交说明
# git log -2 # 查看最近的2次提交
# git log --since=2.weeks # 查看最近两周的提交
# git log --author="leitiannet" # 查看指定用户的所有提交
# git log --graph # 查看基于文本的提交图
# git log --oneline # 查看所有提交(一行显示),--pretty=oneline --abbrev-commit的简写
# git log --stat # 查看提交的文件更改统计
# git log -p # 查看提交引入的差异(按补丁格式输出)
$ git log README.md # 查看指定文件的所有提交
分支开发
$ git branch dev # 创建分支但不检出分支
$ git checkout dev # 检出分支,即切换分支并重置工作区
# git checkout -b dev # 创建并检出分支,相当于git branch+git checkout
$ git branch -a # 查看所有本地分支和远程分支
$ echo "version 1" > index.html # 创建文件
$ git add index.html # 添加文件到暂存区
$ git commit -m "add index.html" # 将暂存区的内容提交到存储库进行存档
合并分支
$ git checkout master # 检出master分支,master为默认分支名字(主分支)
$ git merge --no-ff -m "merge branch dev" dev # 合并dev分支到当前分支(当前分支始终是目标分支),为了在提交历史中明确记录本次分支合并,使用--no-ff创建合并提交
说明:如果对同一个文件的同一行进行不同修改,在合并时就会产生合并冲突(conflicts),使用git diff命令可以查看冲突程度。将合并失败的文件手动编辑为希望的内容,使用git add命令将其标记为冲突已解决,使用git status命令确认合并冲突已被解决。
# 必须手动解决冲突后再提交
$ git add index.html
$ git commit -m "conflict fixed"
标签操作
$ git log --oneline # 查看提交历史,获取commitid
4315dc8 merge branch dev
fbcf44b add index.html
372566c init commit
$ git tag -a -m "version 1.0" v1.0 4315dc8 # 创建附注标签
$ git tag # 查看所有标签
远程仓库
(1)配置SSH密钥
本地仓库和GitHub之间如果通过SSH(Secure Shell Protocol)加密传输,需要配置验证信息。
# 创建密钥,需要输入密钥文件路径和安全密码
$ ssh-keygen -t ed25519 -C "347341200@qq.com"
# id_ed25519是私有密钥,id_ed25519.pub是公开密钥
$ ls ~/.ssh
id_ed25519 id_ed25519.pub
登录GitHub,进入Settings(账号配置),左边选择SSH and GPG keys,然后点击New SSH key,输入密钥名称和id_ed25519.pub文件内容。
# 验证是否正常通信
$ ssh -T git@github.com
(2)创建远程仓库
将本地仓库上传到GitHub服务器,需要先在GitHub上创建远程仓库(New repository),建议远程仓库名称与本地仓库名称保持一致。
(3)添加远程仓库
$ git remote add origin git@github.com:leitiannet/git-practice.git # 添加远程仓库(关联远程仓库),origin为默认远程仓库名字(源)
$ git remote -v # 查看远程仓库
(4)推送远程仓库
$ git push origin master # 将本地仓库的master分支推送到远程仓库,相当于git push origin master:master
$ git push origin v1.0 # 将本地仓库的v1.0标签推送到远程仓库(git push命令默认不会推送标签到远程仓库)
# git push origin --all # 将本地仓库的所有分支推送到远程仓库
# git push origin --tags # 将本地仓库的所有标签推送到远程仓库
(5)克隆远程仓库
$ git clone git@github.com:leitiannet/git-practice.git # 克隆远程仓库(SSH协议),自动创建本地仓库并添加远程仓库
# git clone https://github.com/leitiannet/git-practice.git # 克隆远程仓库(HTTPS协议)
# git clone -b master https://github.com/leitiannet/git-practice.git # 克隆远程仓库指定分支
(6)拉取远程仓库
$ git pull origin master # 拉取远程仓库(自动合并远程分支到当前分支),相当于git fetch+git merge
$ git checkout master # 检出分支并重置工作区
目录结构
$ tree --noreport --dirsfirst -F -f -a
.
|-- ./.git/
| |-- ./.git/hooks/
| | |-- ./.git/hooks/applypatch-msg.sample
| | |-- ./.git/hooks/commit-msg.sample
| | |-- ./.git/hooks/post-update.sample
| | |-- ./.git/hooks/pre-applypatch.sample
| | |-- ./.git/hooks/pre-commit.sample
| | |-- ./.git/hooks/pre-push.sample
| | |-- ./.git/hooks/pre-rebase.sample
| | |-- ./.git/hooks/prepare-commit-msg.sample
| | `-- ./.git/hooks/update.sample
| |-- ./.git/info/
| | `-- ./.git/info/exclude
| |-- ./.git/logs/
| | |-- ./.git/logs/refs/
| | | |-- ./.git/logs/refs/heads/
| | | | |-- ./.git/logs/refs/heads/dev
| | | | `-- ./.git/logs/refs/heads/master
| | | `-- ./.git/logs/refs/remotes/
| | | `-- ./.git/logs/refs/remotes/origin/
| | | `-- ./.git/logs/refs/remotes/origin/master
| | `-- ./.git/logs/HEAD
| |-- ./.git/objects/
| | |-- ./.git/objects/29/
| | | `-- ./.git/objects/29/a422c19251aeaeb907175e9b3219a9bed6c616
| | |-- ./.git/objects/37/
| | | `-- ./.git/objects/37/2566c80ae7f8a8c52dea393ff16761422386b6
| | |-- ./.git/objects/3e/
| | | `-- ./.git/objects/3e/4b5a2b1be344a05925d9e2f685df4e2205c01b
| | |-- ./.git/objects/43/
| | | `-- ./.git/objects/43/15dc884d4984d80f0756892f5242866f9e2a4a
| | |-- ./.git/objects/77/
| | | `-- ./.git/objects/77/adaeeff59f8afb95094ce650757ffaadffa951
| | |-- ./.git/objects/83/
| | | `-- ./.git/objects/83/baae61804e65cc73a7201a7252750c76066a30
| | |-- ./.git/objects/a1/
| | | `-- ./.git/objects/a1/e5c927032ae6aa2e313ee425395156b99e3733
| | |-- ./.git/objects/e6/
| | | `-- ./.git/objects/e6/9de29bb2d1d6434b8b29ae775ad8c2e48c5391
| | |-- ./.git/objects/fa/
| | | `-- ./.git/objects/fa/7fcea2d7ebe3e9c02b8d6001b7cab71230e647
| | |-- ./.git/objects/fb/
| | | `-- ./.git/objects/fb/cf44b523ff4ba022099c2d63f74db62cc3709f
| | |-- ./.git/objects/info/
| | `-- ./.git/objects/pack/
| |-- ./.git/refs/
| | |-- ./.git/refs/heads/
| | | |-- ./.git/refs/heads/dev
| | | `-- ./.git/refs/heads/master
| | |-- ./.git/refs/remotes/
| | | `-- ./.git/refs/remotes/origin/
| | | `-- ./.git/refs/remotes/origin/master
| | `-- ./.git/refs/tags/
| | `-- ./.git/refs/tags/v1.0
| |-- ./.git/COMMIT_EDITMSG
| |-- ./.git/HEAD
| |-- ./.git/ORIG_HEAD
| |-- ./.git/config
| |-- ./.git/description
| `-- ./.git/index
|-- ./images/
| `-- ./images/.keep
|-- ./README.md
`-- ./index.html
参考资料
《Git从入门到精通》