我的Git学习笔记
git 是一种源码管理系统(source code management,缩写为 SCM)。它对当前文件提供版本管理功能,核心思想是对当前文件建立一个对象数据库,将历史版本信息存放在这个数据库中。
安装
-
安装 git
在终端中执行
git --version
命令,如果显示 git 的版本说明安装成功。 -
提交用户名和电子邮件
这些信息将作为提交者信息显示在更新历史中。
Terminal window git config --global user.name 'you'git config --global user.email 'you@gmail.com'选项 说明 --global
表示全局设置用户名或邮箱 - 注意:
user.email
应该填写你 GitHub 的 email,否则 GitHub 无法识别是哪个用户,该 commit 也不会记录在你空间的活动表中。 - 注意:如果不添加
--global
那么将设置为当前项目的配置,你可以在 .git 文件夹的 config 文件中看到你的配置。
git 的全局设定被存放在用户本地目录的 .gitconfig 文件里,也可以直接编辑该配置文件。
[user]name = youemail = you@gmail.com - 注意:
-
查看当前项目的配置信息
Terminal window # 查看所有配置信息git config --list# 查看用户名git config user.name#查看电子邮件git config user.email添加
–-global
将查看全局的配置信息。
基本概念
工作区:
工作区也称“工作树”,是实际被操作的目录,可以理解为实际项目的目录。
暂存区:
暂存区也称“索引”,是为了向数据库提交作准备的区域。Git 在执行提交的时候,不是直接将工作区的更改直接保存到数据库,而是将暂存区的更改保存到数据库。
将工作区的更改添加到暂存区之后,就意味着该文件已被“跟踪”。
数据库:
git 的数据库为两种:
- 远程数据库:配有专用的服务器,为了多人共享而建立的数据库。
- 本地数据库:为了方便用户个人使用,在自己的机器上配置的数据库。
通常的 git commit
操作是将更改提交到本地数据库,而 git push
则是将更改提交到远程数据库。
分支:
分支是为了将修改记录的整体流程分叉保存。分叉后的分支不受其他分支的影响,所以在同一个数据库里可以同时进行多个修改。
一个项目一般会建立多个分支。例如:当功能分支或修复 bug 的分支写好后可以合并分支到主分支中。
注意:在本地创建项目 git 会创建一个名为 master 的分支(如果是在GitHub创建的仓库会是 main 的分支)。因此之后的提交,在切换分支之前都会添加到 master 分支里。
操作流程
-
初始化一个 git 仓库
Terminal window git init -
查看当前仓库状态
Terminal window git status -
将文件从工作区添加到暂存区
Terminal window git add [file1] [file2] ... -
将暂存区的文件提交到本地代码仓库
Terminal window git commit -m [message] -
查看提交 commit 的信息
Terminal window git log -
添加远程指针
Terminal window git add remote origin <url> -
将本机的 master 分支推送到远程 origin 主机
Terminal window git push -u origin master -
将远程主机 origin 的代码取回本地,与本地的 master 分支合并
Terminal window git pull origin master -
比较当前分支和上一次 commmit 的差异
Terminal window git diff HEAD
基本操作
增加
# 添加指定文件到暂存区git add [file1] [file2] ...
# 添加指定目录到暂存区,包括子目录git add [dir]
# 添加当前目录的所有文件到暂存区git add .
选项 | 说明 |
---|---|
-u | 只添加已提交过的文件到暂存区 |
-p | 只添加文件修改的其中一部分 |
-i | 用对话的形式显示添加在暂存区 |
删除
# 删除指定文件,并把这次删除放入暂存区git rm [file1] [file2]
# 停止跟踪指定文件,但该文件会保留在工作区git rm --cached [file]
# 改名,并放入暂存区git mv [file-original] [file-renamed]
选项 | 说明 |
---|---|
--cached | 停止跟踪 |
提交
# 提交暂存区到本地仓库git commit -m [message]
# 提交暂存区指定的文件到本地仓库git commit [file1] [file2] ... -m [message]
# 如果代码没有任何新变化,则改写上一次commit的提交信息git commit --amend -m [message]
# 重做上一次commit,并指定文件的新变化git commit --amend <file1> <file2> ... -m [message]
选项 | 说明 |
---|---|
-a | 直接提交所有工作区、暂存区未提交的更改 |
-m | 指定提交 [message] 里的信息 |
-v | 提交时显示所有 diff 信息 |
--amend | 改写提交 |
分支
-
查看分支
Terminal window # 列出所有本地分支git branch选项 说明 -r
列出所有远程分支 -a
列出所有分支 -
创建分支
Terminal window # 新建分支,但依然停留在当前分支git branch [new-branch-name]# 将当前分支重命名git branch -m [new-branch-name]# 新建分支,指向指定 commit# [commit] 是要将新分支指向的提交记录的哈希值、分支名或者是其他引用名称。# 如果不指定,则默认是当前所在的提交记录。git branch [new-branch-name] [commit]# 新建分支,与指定的远程分支建立跟踪关系git branch --track [new-branch-name] [remote-branch]# 在现有分支与指定的远程分支之间,建立跟踪关系git branch -u [branch-name] [remote-branch]选项 说明 --track
创建一个新的本地分支,并将其与远程分支建立跟踪关系 -u
设置跟踪关系 -m
重命名分支 -
切换分支
Terminal window # 切换到指定分支,并更新工作区git checkout [branch-name]# 新建一个分支,指向某个 taggit checkout -b [branch-name] [tag]选项 说明 -b
新建一个分支,并切换到该分支 -
合并分支
Terminal window # 合并指定分支到当前分支git merge [branch-name]# 选择一个 commit,合并进当前分支git cherry-pick [commit] -
删除分支
Terminal window git branch -d [branch-name]# 删除远程分支git push origin -d [branch-name]# 从本地仓库的跟踪分支列表中删除指定的远程分支# 不会影响远程分支git branch -dr <remote/branch-name>选项 说明 -d
用于删除指定的本地分支或远程跟踪分支 -r
用于指定要删除的远程跟踪分支 -D
强制删除分支,不管有没有合并更改
标签
-
查看
Terminal window # 列出所有 taggit tag# 查看 tag 信息git show [tag] -
新建 tag
Terminal window # 新建一个 tag 在当前 commitgit tag [tag]# 新建一个 tag 在指定 commitgit tag [tag] [commit] -
删除 tag
Terminal window git tag -d [tag] -
提交 tag
Terminal window # 提交指定 tag 到远程仓库git push [remote] [tag]选项 说明 --tags
提交所有 tag
查看信息
-
基础操作
Terminal window # 显示所有文件的变更状态git status# 显示当前分支的最近几次提交git reflog# 显示当前分支的版本历史git log# 显示 commit 历史,以及每次 commit 发生变更的文件git log --stat# 显示某个文件的版本历史,包括文件改名git log --follow [file]# 显示指定文件相关的每一次 diffgit log -p [file]# 显示指定文件是什么人在什么时间修改过git blame [file]选项 说明 --stat
列出每个提交的文件更改统计信息 -p
显示每个提交中某文件的详细更改内容 --follow
跟踪某文件的重命名和移动操作 -
diff 操作
Terminal window # 比较暂存区和工作区的差异git diff# 比较暂存区和上一个 commit 的差异git diff --cached# 比较暂存区和上一个 commit 的特定文件的差异git diff --cached [file]# 比较工作区与当前分支最新 commit 之间的差异git diff HEAD# 比较两个分支/提交之间的差异git diff [branch1/commit1]...[branch2/commit2] # ①- 注意:①这个命令中的三个点号(
...
)是必须的,它们表示比较的方向,即从左往右比较branch1
和branch2
,从右往左比较branch2
和branch1
,然后将两次比较的结果合并起来输出。 - 注意:①这个命令只会输出差异信息,并不会将这些差异合并到任何一个分支中。如果需要将差异合并到某个分支中,需要使用
git merge
命令或其他合并命令。
- 注意:①这个命令中的三个点号(
-
show 操作
Terminal window # 显示某次提交的元数据和内容变化git show [commit]# 显示某次提交发生变化的文件git show --name-only [commit]# 显示某次提交时,某个文件的内容git show [commit]:[filename]
远程
-
查看
Terminal window # 显示所有远程仓库git remote -v# 显示某个远程仓库的信息git remote show [remote]# 下载远程仓库的所有变动git fetch [remote] -
新建远程仓库
Terminal window # 增加一个新的远程仓库,并命名git remote add [shortname] [url] -
克隆远程仓库
Terminal window # 克隆远程仓库# [dir] 为指定新目录的名称,默认为远程仓库的名称git clone <repository-url> [dir] -
push 操作
Terminal window # 上传本地指定分支到远程仓库,不指定则默认为当前分支git push [remote] [branch]选项 说明 --force
强行推送当前分支到远程仓库,即使有冲突 --all
推送所有分支到远程仓库 -
pull 操作
Terminal window # 取回远程仓库的变化,并与本地分支合并git pull [remote] [branch]
撤销
-
checkout操作
Terminal window # 恢复暂存区的指定文件到工作区git checkout [file]# 恢复某个 commit 的指定文件到工作区git checkout [commit] [file]# 恢复上一个 commit 的所有文件到工作区git checkout . -
reset 操作
Terminal window # 重置暂存区的指定文件,与上一次 commit 保持一致,但工作区不变git reset [file]# 重置当前分支的指针为指定 commit,同时重置暂存区,但工作区不变git reset [commit]# 重置暂存区与工作区,如果没有指定 commit,则默认与上一次 commit 保持一致git reset --hard [commit]选项 说明 --hard
重置当前分支的 HEAD 为指定 commit,同时重置暂存区和工作区,与指定 commit 一致 --keep
重置当前 HEAD 为指定 commit,但保持暂存区和工作区不变 注意:使用
--hard
之前请备份未提交的更改,否则会导致未提交的更改永久丢失! -
revert 操作
Terminal window # 新建一个 commit,用来撤销指定 commit# 后者的所有变化都将被前者抵消,并且应用到当前分支git revert [commit]
其他
# 生成一个可供发布的压缩包git archive