简单入门了一下git的基本理念和git branch的各种操作……
基本概念
- 版本管理:
- git对文件历史版本的管理基于快照的(完全拷贝),而非基于增量。
- 这样做的好处就是安全性比较高,恢复速度快;但想必也付出了相应的代价。
- 每次本地clone都获得了该repository(仓库)的全部历史版本,而非当前快照
git的三个状态三个区:
- Modified:修改且没add,文件在工作区
- Staged(Cached):add但是没commit,文件在暂存区
- Committed:没修改或者修改并commit了,文件在本地仓库
本地仓库和远程仓库:
- 远程仓库和本地仓库是独立的,但可以通过ssh等方法同步
- clone、push、pull其实就是在做远程和本地仓库的同步
- 文件的四个状态:
- Unmodified:未修改
- Untracked:未追踪,新文件(Untracked files)或者ignored
- Modified:已修改,且未暂存(Changes not staged for commit:)
- Staged:已暂存(Changes to be committed)
git常见操作
clone:克隆远程仓库至当前本地目录
1
git clone url
add:本质是将文件modified=>staged,即将文件的变化纳入跟踪,等候commit。如果新增了文件或修改了上一个版本的文件,则需要通过add命令跟踪文件,此后的提交就会记录该文件的加入或更新。add可以跟踪某个文件,也可以制定一个路径跟踪该路径下的全部文件。
1
git add README.md
2
git add .
git对add操作的执行似乎是这样的:由于文件add后从工作区进入了暂存区,而暂存区同样在.git里,所以执行一次git add操作是会对.git进行修改的。如果对一个文件修改后add,再修改再add,此后进行commit操作,那么第一次add后的那个版本是不能体现在git中的,即版本丢失。至于在commit前是否还能保存这个版本,没有做具体研究,可能需要了解一下git gc垃圾回收机制。
status:用于查看当前branch以及repository中各个文件目前的状态(untracked, modified, staged)
1
git status
2
Changes to be committed:已暂存(即已经add)
3
Changes not staged for commit:已修改(即需要通过add进入暂存区)
diff:具体查看上一个版本和当前工作区的delta,即当前工作区对上一版本的修改
1
git diff
commit:本质是将文件staged=>committed。将暂存区文件提交到本地仓库,即将所有确认需要commit的被修改的文件进行commit操作。此时会在.git里形成一个全新的版本。
1
git commit -m 'new commit message'
checkout:撤销工作区对文件的修改,回到该文件上一commit时的状态
1
git checkout -- FILE.name
2
git checkout .
push:提交本地commit至远程仓库。所有本地领先的commit都将被同步至远程仓库
1
git push origin local_branch:remote_branch
pull:拉取远程仓库至本地。本地的工作区的工作需要先commit、stash或checkout才可以进行拉取操作
1
git pull origin local_brach:remote_branch
git ignore
当某个目录中存在.gitignore
文件时,在这个文件的子树下的文件追踪会遵循该文件的逻辑进行忽略/反忽略追踪。当项目中出现无关紧要的文件(如配置文件与密码,非常大的数据库,可以使用代码自动生成二进制文件或可以编译产生文件等),可以使用git ignore屏蔽对它们的追踪。
1 | # 忽略所有的.a文件 |
2 | *.a |
3 | |
4 | # 但跟踪所有的lib.a,即便你在前面忽略了.a文件 |
5 | !lib.a |
6 | |
7 | # 只忽略当前目录下的 build 文件,而不忽略subdir/build |
8 | /build |
9 | |
10 | # 忽略任何目录下名 build的文件夹 |
11 | build/ |
12 | |
13 | # 只忽略当前目录下名为 build 的文件夹 |
14 | /build/ |
15 | |
16 | # 忽略doc/notes.txt,但不忽略doc/server/arch.txt |
17 | doc/*.txt |
18 | |
19 | # 忽略 doc/目录及其所有子目录下的.pdf文件 |
20 | doc/**/*.pdf |
git branch
branch:查看当前所在的分支和所有分支信息
1
git branch
2
git branch -a
branch:新建、删除本地分支
1
git branch new_branch_name
2
git branch -d branch_name
checkout:切换本地分支
1
git checkout another_branch
merge:分支合并
1
git checkout master
2
git merge another_branch
git的操作还有非常的多,其实底层也有一套值得深究的东西。如果不只是把它当做一个工具来使用的话,还有非常多的东西值得学习,要精通git还是有一定难度的。
参考: git官方教程