Git 基础操作 - 笔记

个人读书笔记,详细信息请参考: https://git-scm.com/book/zh/v2

Git 运行前配置

1、Git的配置存储在以下三个地方:
  a、/etc/gitconfig: 包含系统上每一个用户及他们仓库的通用配置;使用带有--system的git config 命令时, 它就是读写该文件中的配置;
  b、~/.gitconfig或~/.config/git/config: 只针对当前用户. 传递 --global选项读写此文件。
  c、当前使用仓库的Git目录中的config文件: 针对该仓库. 使用--local强制Git读写此文件, 默认情况下(进入该目录)也是使用它。
  d、可以使用git config --list --show-origin查看所有配置及它们所在的文件.

2、配置用户信息
  git config --global user.name "<用户名>"
  git config --global user.email <用户邮箱>
  注:由于加了--global, 因此Git都会使用那些信息;

 

Git基础

1、获取Git仓库

a、将本地目录转换为Git仓库
    cd <进入到你转换的目录>
    git init
	git add <可以为某些文件, 也可以为当前目录'.'>
    git commit -m '<提交备注信息>'

    # Note: 自动把所有已跟踪过的文件暂存起来一并提交, 跳过git add步骤
    git commit -a -m '<提交备注信息>' 

	# 从Git中移除文件,并且连带从工作目录中删除,随后再次提交的话该文件就从版本库中删除了
	git rm <待删除的文件名>   ; git commit -m '删除文件xxxx'

	# 如果删除之前该文件已经修改过,或者已经存放到了暂存区, 则必须使用 -f选项
	git rm -f <待删除的文件名> ; git commit -m '删除文件xxxx'

	# 如果希望文件从Git中删除, 但是仍然保留本地工作目录中的,可以使用:
	git rm --cached <待删除的文件>

	# 撤销操作
	git commit --amend: 主要用于遗漏文件没有提交,或者覆盖之前的提交信息时

	# 取消暂存区的文件
	git reset HEAD <文件> : 取消暂存<文件> #注:这个命令比较危险,尤其是带了--hard
	git checkout -- <文件>: 取消本地所做的修改, 即: 使用之前提交的覆盖本地工作目录 

	# 查看提交历史
	git log
    git log -2: 仅显示最近2条
	git log -p: 仅显示每次提交锁引入的差异
	git log --pretty=oneline: 美化输出效果

  b、从其他服务器克隆一个已存在的Git仓库
	git clone <url> # 这时会生成一个目录, 该目录下为对应的文件内容
	git clone <url> <自定义的目录名>

 

2、Git文件的状态

  a、已跟踪: 指被纳入到版本管理的文件状态, 之后该文件可能状态有: 未修改、已修改、已放入暂存区;
  b、未跟踪: 除了已跟踪的文件之外,其他文件属于未跟踪状态;对一个未修改状态的文件进行删除之后也是未跟踪状态。
  c、使用git status进行文件状态的检测;
  d、使用git diff详细列出工作目录与暂存区快照之间的差异.
  e、使用git diff --staged命令查看已暂存与上次提交之间的差异;

 

3、.gitignore:过滤无需提交的文件

4、远程仓库相关命令

  a、git remote -v:列出指定的每一个远程仓库使用的Git的简写与其对应的URL

  # 添加远程仓库
  a、git remote add <指定的简称> <URL>:添加一个远程仓库,同时指定一个方便使用的简写,以后'指定的简称'就代表远程仓库了
	 git fetch <指定的简称>: 从远程仓库中拉取信息,注意:它仅是将数据下载到本地仓库,并不会自动合并或者修改当前的构造。
  b、git clone命令自动添加远程仓库,默认的远程仓库为origin,并且本地的master分支也自动地跟踪远程的master分支;
  c、如果当前分支设置了跟踪远程分支,那么使用git pull命令将会抓取后合并到当前分支。
  d、git push <远程分支> <本地分支>: 将'本地分支'推送到'远程分支'服务器上
	注:只有有写权限,并且远程分支不存在其他人推送过记录才会推送成功,否则需要先进行fetch和merge操作之后才行。
  e、git remote show <远程分支>
  f、git remote rename <当前远程仓库的名字> <更新后远程仓库名字>
  g、git remote remove <远程仓库的名字>:删除一个远程仓库,所有与该远程仓库相关的远程跟踪分支及配置信息一并被删除
  h、git tag或者git tag -l "模式":列出已有的标签;

 

5、标签

  a、轻量标签:本质是将提交校验和存储到一个文件中,没有保存任何其他的信息。
    git tag v1.4
	git show v1.4:看不到额外的标签信息
  b、附注标签:它是存储在Git数据库中的一个完整对象,它们是可以被校验的,其中包含打标签的名字、电子邮件等信息;
	git tag -a v1.4 -m "xxxx"

	附注标签可以在后期再打,例如:
	git tag -a v1.5 <校验和>

    #将标签推送到远程仓库
	git push origin <标签名>

	# 删除本地标签
	git tag -d <标签名>
	注: 这并不会将远程仓库的标签删除, 用户必须执行git push <远程仓库>才会更新远程仓库

	# 删除远程仓库标签
	git push origin --delete <标签名>

	# 检出标签(不太建议使用)
	git checkout <标签名>
	注:这将会导致HEAD指针处于分离状态,即:在之上进行的修改后提交并不会提交到该标签中,也不属于任何的分支,用户如果需要访问它,那么必须找到刚才提交的哈希值后才能访问。

	# 检出标签到另一个分支中
	git checkout -b <新分支名> <标签>:本命令在本地创建了一个分支并指向它,之后在该分支上的修改可以提交到该分支上去,HEAD指针也会随之移动。

 

6、分支

a、要理解分支,首先需要了解Git如何保存数据的?
	当使用 git commit 进行提交操作时,Git 会先计算每一个子目录(本例中只有项目根目录)的校验和, 然后在 Git 仓库中,这些校验和保存为树对象。随后,Git 便会创建一个提交对象,它除了包含上面提到的那些信息外,还包含指向这个树对象(项目根目录)的指针。 如此一来,Git 就可以在需要的时候重现此次保存的快照。
	提交之后,Git仓库中有五个对象:blob对象(文件的快照)、树对象(记录着目录结构和 blob 对象索引)、提交对象(包含着指向前述树对象的指针和所有提交信息)。
	
	因此:Git的分支就是指向提交对象的可变指针(HEAD)。Git默认分支为master,每次提交,那个可变指针均会自动向前移动。

  b、分支命令
	git branch <分支名> : 在当前的提交对象上创建分支,此时HEAD指针!!!并不会!!!指向该新建分支;
	git checkout <分支名> : 切换到已存在的分支,此时HEAD指针指向该分支;
	git checkout -b <分支名> : 在当前的提交对象上创建分支,并将HEAD指针指向新建分支
	git merge <分支> : 将'分支'合并到当前的分支,注:如果顺着一个分支走下去能到另一个分支,那么Git在合并的时候只会将HEAD指针向前移动,这种模式成为'快进(fast-forward)';还有另外一种模式称为三方合并:共同的起点,各自分支的内容,从而形成一个新的提交对象。
	
	合并时出现冲突,此时需要解决冲突:
		git status: 查看那些包含冲突而处于未合并状态(unmerged)的文件
		git mergetool 调用对比工具进行查看,进行冲突解决
		git commit 冲突解决之后再进行提交;

	# 查看分支
	git branch : 带 '*'表示当前HEAD所指向的分支
	git branch -v: 查看每个分支最后一次提交

	# 删除分支
	git branch -d <分支名> : 删除已经合并了的分支
	git branch -D <分支名> : 强制删除未被合并的分支

c、分支管理
  一般会将master分支作为完全稳定的代码,或者发布版本;develop分支用于开发使用;各个开发者从develop上创建各自的分支进行开发,开发完成之后,由develop分支管理者合并各个开发者的分支;
  然后再对该分支打一个标签,用于测试使用。

d、远程分支
  远程引用表示对远程仓库的引用(指针),包括分支、标签等等。可以通过以下命令查看远程分支的信息:
  git ls-remote <远程分支名>
  git remote show <远程分支名>

  远程跟踪分支是对远程分支状态引用的常用做法。它们是你无法移动的本地引用,但是可以精确反映远程仓库的状态。远程跟踪分支以<远程仓库>/<远程分支名>(例如: origin/master)的形式命名.

  # 拉取远程分支数据,同步其他用户修改
  git fetch <远程仓库> : 同步'远程仓库'数据,更新本地数据库, 并移动<remote>/<branch>指针到更新之后的位置;
						 注:可以 fetch 多个远程分支,从而将其他远程分支的内容抓取到本地。

  # 推送分支到远程
  git push <远程仓库> <本地分支> : Git自动将'本地分支'更新到远程仓库分支,该分支名称与'本地分支'一样;
  git push <远程仓库> <本地分支>:<远程分支> Git自动将'本地分支'更新到远程仓库,并且重命名远程分支名称;

  git fetch <远程仓库> : 从远程仓库中拉取数据,并且如果该仓库上存在远程分支,则同样会在本地生成一个远程分支。需要注意的是,当抓取到新的远程跟踪分支时,本地不会自动生成一份可编辑的副本,也即本地不会生成一个新的分支供用户进行操作,除非用户使用git checkout -b <本地分支名> <远程仓库>/<远程分支名>之后才会生成一个用于工作的本地分支。

  # 删除远程分支
  git push <远程仓库> --delete <远程分支>

e、跟踪分支
  从一个远程跟踪分支检出一个本地分支会自动创建'跟踪分支'。跟踪分支是与远程分支有直接关系的本地分支。如果在一个跟踪分支上执行git pull,Git能自动地识别并从服务器上抓取、合并到当前本地跟踪分支。

  # 创建远程仓库的跟踪分支
  git clone xxx : 会创建一个本地跟踪分支master,该分支跟踪origin/master,即:远程仓库origin的master分支

  git checkout -b <本地跟踪分支> <远程仓库>/<远程仓库分支> : 从远程仓库的远程仓库分支上创建一个本地跟踪分支,用户将可以在该跟踪分支上进行工作。后续修改后提交,新增的内容将会提交到本地的仓库分支上。然后再进行push时,将会将分支上的内容推送到远程仓库的对应分支上。

  git checkout --track <远程仓库>/<远程仓库分支> : 这个与上面的命令效果一样。
  git checkout <远程分支名> : 这个与上面的命令效果一样。
  
  # 设置已有的本地分支跟踪一个刚刚拉取下来的远程分支,或者想要修改正在跟踪的上游分支
  git branch -u origin/<远程分支名称> : 这样,本地分支将跟踪远程仓库origin的远程分支

  # 将远程分支与本地跟踪分支进行合并
  git pull : 在该跟踪分支上执行
  或者
  git fetch; git merge

  # 查看设置的所有跟踪分支
  git branch -vv
  注意: 如果需要同步最新的状态,则可以这样做:
  git fetch --all; git branch -vv

f、变基(rebase)
  Git整合不同分支存在两种方法:merge和rebase。之前说过,merge存在两种方式,一种称为fast-forward,另外一种称为三方合并,形成新的提交。
  而rebase是指将某个分支的修改提取出来,然后再另一个分支上重新应用一次。使用rebase将某一分支上的所有修改都移至另一分支上,如同“重新播放一样”。
  
  例如:将experiment变基到master
  git checkout experiment
  git rebase master

  变基存在风险,需要谨慎使用!!!
  如果提交存在于自己仓库之外,而别人可能基于这些提交进行开发,那么不要执行变基。

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值