0%

git 入门

简单入门了一下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官方教程