这是我参与11月更文挑战的第7天,活动详情查看:2021最后一次更文挑战
- 使用
git
已经很久,但从未整体总结过,这次就对git
的进行一次总结和思考。
一.为什么要使用git
- 方便 版本控制
- 版本控制:记录项目的所有变化,以方便查阅,回退。
二.版本控制的分类
- 本地版本控制:复制整个项目,同时手动进行版本记录,比如
1.0.0
,2.0.0
进行区分和管理。 - 集中式版本控制:用一个中央服务器保存所有的版本记录,其他人从这取出文件,或者提交文件。
- 分布式版本控制:每一人都拥有着当前项目的所有版本记录。修改和其他操作在本地进行,可以将自己的修改推送给别人。
- 基于差异的版本控制:保存每个文件随着时间的差异记录。
三.git文件状态
-
未跟踪: 没有被
git
记录的文件,比如.gitignore
中的文件。新增的文件往往没有被跟踪,需要被add
,加入暂存区,commit
保存进git
数据库中进行跟踪。类似与 修改(modified) 状态 -
已跟踪: 纳入版本控制的文件。只有已被纳入版本控制的文件,才有下述三种状态。
-
修改(
modified
): 在工作区修改文件。还没有进行add
操作。 -
暂存(
staged
): 已经进行add
操作,把修改的文件进行标记,放到 暂存区。未commit进行保存。 -
提交(
commited
): 已经进行commit
,将 暂存区 的文件提交到本地数据库。
-
-
git status
查看当前工作区的状态。- 工作区无任何修改:
On branch main Your branch is up to date with 'origin/main'. nothing to commit, working tree clean 复制代码
- 工作区有修改的情况,
.gitignore
文件被修改了,需要进行add
进入暂存区,commit
进行提交。或者restore
进行撤回操作。node_modules/
下的文件未被跟踪,需要进行add
和commit
On branch main Your branch is up to date with 'origin/main'. Changes not staged for commit: (use "git add <file>..." to update what will be committed) (use "git restore <file>..." to discard changes in working directory) modified: .gitignore Untracked files: (use "git add <file>..." to include in what will be committed) node_modules/ no changes added to commit (use "git add" and/or "git commit -a") 复制代码
-
查看当前状态简略版:
git status -s
。M已修改文件,??
未被git
追踪文件,A暂存区文件
M .gitignore
?? node_modules/
复制代码
四.查看文件的修改
git diff
: 查看已在暂存区的文件和未暂存的文件做了哪些修改
diff --git a/.gitignore b/.gitignore
index 960be9a..0e9b283 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,3 +1,3 @@
-node_modules
-package-lock.json
-yarn.lock
\ No newline at end of file
+# node_modules
+# package-lock.json
+# yarn.lock
\ No newline at end of file
复制代码
git diff --staged
: 查看已暂存(add) 的文件和 已提交(commited) 的文件有哪些变化。
五.暂存区
1.加入暂存区
git add .
:将当前目录下的所有文件修改加入暂存区git add -u
: 将已被追踪的文件修改加入暂存区,可追溯上级目录。git add -A
: 将所有文件修改加入暂存区,可追溯目录修改,比如在目录第一层新增文件,现在处于目录的目录的目录,那么git add -A
会找到最上一层的文件修改进行暂存。
2.撤销暂存区
git reset HEAD [file]
: 撤销加入暂存区的指定文件git reset HEAD *
:撤销加入暂存区的所有文件,在Mac中不包括.开头的文件git reset HEAD .*
: 撤销加入暂存区的.开头的文件git rm
:加文件名或者目录或者正则匹配,移除暂存区git rm -f
:强制移除,连文件都直接删除(尽量不要使用)git rm --cached
:只是移除暂存区,不删除文件
六.提交文件
1.提交文件的操作:
git commit
: 提交文件,接下来填写修改信息。git commit -m
: 提交文件同时填写修改信息。git commit -a
: 跳过暂存区,直接提交文件,等于跳过了git add
操作
2.提交不可撤销,但可以替换
git commit --amend
: 第二次的提交将替换第一次的提交,最终只会有一个体交
七.移动文件(更多是用来重命名)
git mv file_from file_to
八.查看提交历史
git log
: 查看提交历史。
git log -p
: 查看提交历史和差异,会特别长。
git log -p -2
: 查看提交历史和差异,并限制日志条目,只显示最近两次的提交。
九.远程仓库
git clone [url]
:克隆远程仓库git remote
: 查看所有的远程仓库,origin
是默认远程仓库名

git remote -v
: 显示远程仓库名和地址
-
git remote add [shortname] [url]
: 添加远程仓库,同时指定一个shortname来简称它 -
git fetch [shortname]
: 拉取远程[shortname]仓库中本地没有的信息,但并不会合并到本地中,需要手动合并。比如,本地长裤会有一个master
分支和一个origin master
分支。fetch
会拉取远程仓库的master
分支到本地的origin master
而不会到master
。如果需要,需要手动merge
合并。但是pull
命令则会同时更新本地的master
和origin master
。如果有冲突,则会直接提示。 -
git push [remote] [branch]
:remote
表示远程仓库名字,branch
表示分支,不指定默认当前仓库的当前分支。 -
git remote show [remote]
:remote
表示远程仓库名字,查看远程仓库的信息,默认当前仓库。 -
git remote rename [newname] [oldname]
: 仓库重命名 -
git remote remove [name]
: 移除远程仓库
十.分支
1.新建分支
git checkout -b [newbranch]
: 从当前分支中克隆一个新分支,等同于
git branch [newbranch]
git checkout [newbranch]
复制代码
2.切换分支
git checkout [branch]
: 从当前分支切换到[branch]
分支
3.查看分支
git branch
: 查看当前分支。*
号的表示当前分支
git branch -v
: 查看当前分支的最后一次提交
4.合并分支
-
git merge [branch]
: 当前分支合并指定的[branch]分支。如果遇到冲突,需要手动打开冲突的文件,进行解决。解决完之后,需要用git add
命令进行暂存。 -
git rebase [branch]
: 变基合并,与merge
不同的是,rebase
会对比当前分支和指定分支[branch]的共同父分支。将指定分支[branch]作为基底,将修改的部分作为记录放在指定分支,即基底的后面,而不是形成一条新的分支记录。等同于git rebase [basebranch] [topicbranch]
-
git rebase --onto [A] [B] [C]
: A,B,C是三个分支名。让C分支带着B和C共有的分支记录,合并进A分支记录的后面。
5.删除分支
git branch -d [branch]
: 删除指定的分支,或者使用git branch -D [branch]