git基础

特点

  • 分布式版本控制系统,直接记录快照(blob对象),而不是保存差异累计

  • 存储项目随时间改变的快照

  • 可靠性和本地执行,本地拥有完整的历史记录

  • 轻量级分支

  • 完整性:存储文件前通过SHA-1计算校验和,确保

  • 几乎只增加数据而不丢失或修改,快照流

状态:

  • 已修改:在工作区修改了文件

  • 已暂存:添加到暂存区

  • 已提交:保存到git仓库

git配置

  1. /etc/gitconfig 文件:包含系统上每一个用户及他们仓库的通用配置。 如果使用带有 --system 选项的 git config 时,它会从此文件读写配置变量。
  2. ~/.gitconfig~/.config/git/config 文件:只针对当前用户。 可以传递 --global 选项让 Git 读写此文件。
  3. 当前使用仓库的 Git 目录中的 config 文件(就是 .git/config):针对该仓库。

每一个级别覆盖上一级别的配置

命令:

1
2
3
4
git config --global user.name "Js"
git config --global user.eamil Js@gemail.com
git config --global core.editor emacs // 设置打开编辑器
git config --list // 查看配置信息

git工作流

  1. git clone将remote克隆到本地

  2. git checkout -b my-feature创建自己的分支,将branch所有源文件同步给硬盘

  3. git diff查看修改

  4. git add

  5. git commit

  6. git push origin my-feature

    1. 倘若此时远端仓库已被修改

    2. git checkout main —> git pull origin master获取最新代码

    3. git checout my-feature —> git rebase main将最新分支传入f-commit之前,手动解决conflict

      rebase和merge直观区别:

      Init–>update–>f-commit和init–>f-commit(merge update)

    4. git push -f origin my-feature

  7. 当pr或者squash and merge后

  8. git checkout main —> git branch -D my-feature —> git pull

常规操作

1、创建仓库

git init:创建新仓库。创建.git子目录,包含初始化git仓库的所有必须文件

git clone [url]:克隆现有仓库,拉取每一个文件每一个版本

初次克隆某个仓库的时候,工作目录中的所有文件都属于已跟踪文件,并处于未修改状态。

同步更新

git clone git://git.kernel.org/pub/scm/git/git.git

2、添加暂存区(跟踪文件)

文件可以看作只有两种状态:已跟踪未跟踪

1
git add [文件/目录]

跟踪文件,添加到暂存区,等待提交

把当前版本的文件快照保存到 Git 仓库中(Git 使用 blob 对象来保存它们)

通过 git status 查看状态

1
2
3
4
5
git status -s
M README // 已修改未暂存
M Rakefile // 已修改且暂存
A lib/git.rb // 已暂存
?? LICENSE.txt // 未跟踪

修改后未执行git add暂存然后直接git commit:会提交上次git add的版本而不是现在修改过的版本

3、提交
1
2
3
4
git commit -m "Story 182: Fix benchmarks for speed"
[master 463dc4f] Story 182: Fix benchmarks for speed
2 files changed, 2 insertions(+)
create mode 100644 README

Git 会先计算每一个子目录的校验和,然后在 Git 仓库中这些校验和保存为树对象。 随后,Git 便会创建一个提交对象,它除了包含上面提到的那些信息外,还包含指向这个树对象(项目根目录)的指针

git commit -a == git add && git commit

git log:查看提交记录,常见参数 -p --stat -数字

4、撤销

git commit --amend:这个命令会将暂存区中的文件提交。 如果自上次提交以来你还未做任何修改(例如,在上次提交后马上执行了此命令),那么快照会保持不变,而你所修改的只是提交信息。

git reset HEAD <file>…:取消暂存

git checkout -- <file>:(危险)撤销对文件的修改

5、移动或删除文件

git mv <> <>:相当于mv,git rm,git add

git rm <file>:从暂存区移除并删除文件,–cached参数只移除不删除

远程仓库

git remote add <shortname> <url>:添加远程仓库

git remote [remote-name] :查看远程仓库,默认名称origin,默认分支master(现在是main了)

git remote show origin:查看更多信息

git fetch:抓取新推送

git pull:抓取并合并

git push origin master:推送

git remote rename pb paul:修改远程仓库简写名

git remote remove:移除远程仓库

打标签

git tag:列举标签

git tag -a v1.4 -m ‘my version 1.4’:创建附注标签,完整对象

git show v1.4

额外:

.gitignore

忽略这些文件,不进行管理

1
2
3
4
5
6
7
8
9
10
11
12
# no .a files
*.a
# but do track lib.a, even though you're ignoring .a files above
!lib.a
# only ignore the TODO file in the current directory, not subdir/TODO
/TODO
# ignore all files in the build/ directory
build/
# ignore doc/notes.txt, but not doc/server/arch.txt
doc/*.txt
# ignore all .pdf files in the doc/ directory
doc/**/*.pdf
git dff
  • git diff查看未暂存的改动

  • git diff –staged查看暂存区的改动

命令别名
1
2
3
4
5
git config --global alias.co checkout
git config --global alias.br branch
git config --global alias.ci commit
git config --global alias.st status
git config --global alias.last 'log -1 HEAD'

分支

1、我们在add时暂存区保存着快照对象(blob对象),当git commit时首先计算哈希值,创建一个树对象保存所有哈希值,树对象包含指向blob的指针,随后创建一个提交对象包含指向树对象的指针,然后提交

2、而每次修改后提交,提交对象包含指向上版本的提交对象的指针,使用以下命令查看指针指向git log --decorate --oneline

3、HEAD是指向当前所在分支的指针

4、当我们切换分支进行commit时,当前分支向前移动,其他分支不变,这样每个分支都可以基于各自版本分叉历史,

5、git的分支本质仅是包含所指对象校验和(长度为 40 的 SHA-1 值字符串)的文件,所以它的创建和销毁都异常高效


分支管理:

git branch < name >: 创建分支

git branch -d <name>:删除分支

git branch -M main:强制重命名

git checkout [-b] <name> <commit-hash> :(创建并)切换分支

git merge < name > :合并分支

直接使用git checkout不会更改当前分支指针,只会改变commit,git checkout - 返回,此时处于“分离HEAD”状态

再使用git switch -c < branch>在当前提交创建分支

git branch:获取分支列表

git branch -v:获取分支列表最后一次提交信息

git branch --no-merged:

注意:

当切换分支时记得git commit -a,因为git会重置工作目录,回到最后当分支最后一次提交的模样

合并分支时

1、没有冲突时

  • 若是直接祖先,进行快进(fast-forward),直接前进指针
  • 三方合并,git自行决定最优公共快照

2、解决冲突

1
2
3
4
5
<<<<<<< HEAD:file
HEAD的file的内容
=======
branch的file的内容
>>>>>>> branch:file

Git 常用命令速查表