Git基本操作(教程总结)

常规操作

  • git add 或者 git add . 直接添加全部修改内容到暂存区
  • git commit -m “info” 到达本地版本库

版本回退

  • git log 显式提交日志 git log --pretty=oneline 输出单行简化版
  • git reset --hard HEAD^ 返回到上一次commit的版本,丢失了上次commit之后的所有信息,若要再返回,使用git reflog 显式出记录的每次操作
  • git reset --hard <log中的编号>

撤销修改

  • git checkout – 将对应文件的修改全部撤销,如果暂存区有还没commit的file,则用暂存区的替换工作区,否则直接用版本库的file进行替换

后话: git checkout 的意思是切换到另一个分支,注意区分

删除文件

  • 手动删除或者命令行输入rm ,然后将删除提交,此处向暂存区提交可以使用add, 也可以使用rm,然后正常commit即可
  • 或者直接git rm ,这样一步执行了删除和add的工作
  • 如果是误删,则直接使用撤销修改git checkout – ,注意,但是会失去最后一次入库之后、删除之前,修改的内容

添加远程仓库

  • 先在github建立新的repo,复制地址
  • git remote add origin <地址> 例如 [email protected]:guozix/learngit.git,origin是git默认的远程库名称
  • git push -u origin master 将本地库内容推送到远程库,实际是将当前分支master推到远程库,第一次推送因为远程库是空的,所以使用了 -u

以上操作的实际目的是将一个远程库和本地库相关联,之后在本地库 push 即可同步到远程库。实现此目的的另一种常用的办法是,新建 github 仓库之后,在本地新建文件夹,在其中使用 git clone <地址> 得到空的库,然后修改提交即可。另外,github 对每个repo给出的地址值不止一个,https的地址使用的是 https 协议,默认的 git:// 地址使用的是ssh协议,使用ssh协议速度快。

分支管理

  1. 创建与合并分支

    创建分支
  • git checkout -b dev 创建了 dev 分支并切换到了 dev 分支,意味着之后的修改和提交都默认对 dev 进行操作,master 分支保持着上一次提交的内容不变。

    注:-b 参数表示创建并切换,相当于
    git branch dev
    git checkout dev

  • git branch 输出所有分支,并标注正在处理的分支
  • git checkout master 返回 master 分支,此时所有文件内容回到创建分支时候的情况
    合并
  • git merge dev 将指定分支(dev)合并到当前正在处理的master分支上,如果将 master 合并到 dev 上,则dev保持不变
  • git branch -d dev 删除 dev 分支

    git的分支操作非常迅速,使用分支能安全的处理阶段性任务

  1. 冲突处理

  • 上面的情况是,一个分支有提交,另一个没有,则合并能够更新未改变的分支
  • 如果两个分支都有commit ,则直接使用merge 会出现冲突,直接查看文件内容,可以看到两个分支修改的内容,手动处理冲突,然后add,commit 之后完成分支合并
  • git log --graph --pretty=oneline --abbrev-commit 命令输出每次commit 生成的结构图,看出最后两个分支汇聚一点
  • 最后删除 dev 分支 git branch -d dev
  1. 分支管理策略

  • git 默认使用 Fast forward 模式合并分支,合并、删除分支后,被删除分支的提交信息被删除,可以不采用ff 模式的merge
  • git merge --no-ff -m “merge with no-ff” dev 指令即使在分支删除之后也能保留分支合并树,使用 git log --graph --pretty=oneline --abbrev-commit 可以看到在分支中提交的信息
  1. Bug分支

修复 bug 可以利用分支,例如,工作于 dev 分支,遇到 bug 后需要新建一个分支用于处理问题。

  • git stash 将当前工作区现场储存,可以之后恢复。之后使用 git status 可以看到工作区是干净的。
    修复 master 分支上的 bug :
	git checkout master
	git checkout -b issue-101
	(fixing)
	git add .
	git commit -m "fixed bug"
	git checkout master
	git merge --no-ff -m "merged fixed bug" issue-101
  • git checkout dev 回到 dev 分支, git status 看到工作区是干净的
  • git stash list 显示出储存的工作区状态
  • 恢复现场的两个方法:
	# first
	git stash apply //恢复之后stash内容不删除,可以指定要恢复的工作区名称
	git stash drop //删除stash
	# second
	git stash pop //恢复的同时删除stash

此时,用 git stash list 看不到任何stash内容了

  1. Feature分支

	git checkout -b feature-new
	git add .
	git commit -m "add new feature"
	git checkout dev
	# 准备合并

此时出现特殊情况,不再需要这个功能,之后需要在没有合并的情况下销毁这个分支:

$ git branch -d feature-vulcan
error: The branch 'feature-vulcan' is not fully merged.
If you are sure you want to delete it, run 'git branch -D feature-vulcan'.
# git 提醒,删除将丢失修改,提示使用 -D
$ git branch -D feature-vulcan
Deleted branch feature-vulcan (was 287773e).

若分支还没修改,使用 git branch -D feature-new 删除

  1. 多人协作

  • 克隆下来的远程库默认名称是 origin,git 将远程库和本地库的 master 统一起来。
	# 查看远程库信息
	git remote
	# 更详细信息
	git remote -v
	得到:
	origin  [email protected]:michaelliao/learngit.git (fetch)
	origin  [email protected]:michaelliao/learngit.git (push)
	分别指出了可以抓取和推送的 origin 地址
推送分支
git push origin master
git push origin dev

原则:

  • master分支是主分支,因此要时刻与远程同步
  • dev分支是开发分支,团队所有成员都需要在上面工作,所以也需要与远程同步
  • bug分支只用于在本地修复bug,就没必要推到远程了,除非老板要看看你每周到底修复了几个bug
  • feature分支是否推到远程,取决于你是否和你的小伙伴合作在上面开发
抓取分支

例如在另外一台电脑(添加SSH key 之后)或另一个文件夹下克隆远程库。

git clone git@github~~
# 查看分支
git branch 
得到:* master
# 默认情况下,clone只同步了master分支
  • 现在如果想要在dev分支上开发,就必须创建远程库的dev分支到本地
	git checkout -b dev origin/dev
	# 之后可以在dev分支上继续修改
	git add env.txt
	git commit -m "add env"
	git push origin dev
  • 此台电脑已经想远程库提交了修改,此时在另一台电脑对同样的文件进行修改,并试图推送
	cat env.txt
	git add env.txt
	git commit -m "add new env"
	git push origin dev
	得到:
To github.com:michaelliao/learngit.git
 ! [rejected]        dev -> dev (non-fast-forward)
error: failed to push some refs to '[email protected]:michaelliao/learngit.git'
hint: Updates were rejected because the tip of your current branch is behind
hint: its remote counterpart. Integrate the remote changes (e.g.
hint: 'git pull ...') before pushing again.
hint: See the 'Note about fast-forwards' in 'git push --help' for details.
  • 推送失败,因为两台电脑提交冲突,解决方法是,先用 git pull 将最新的提交从 origin/dev 抓取下来,然后在本地解决冲突,再推送
	git branch --set-upstream-to=origin/dev dev
	# 这一步先将本地dev与远程origin/dev分支链接
	git pull
	# 手动解决
	git commit -m "file env conflict"
	git push origin dev
  1. Rebase

  • 进行分布式开发之后的分支变得杂乱,git提供了叫做“变基”的操作,将分支的提交变成直线
  • 同步远程之后,修改、提交两次hello.py 文件,使用 git log 查看,提示本地领先两次提交
$ git log --graph --pretty=oneline --abbrev-commit
* 582d922 (HEAD -> master) add author
* 8875536 add comment
* d1be385 (origin/master) init hello
*   e5e69f1 Merge branch 'dev'
|\  
| *   57c53ab (origin/dev, dev) fix env conflict
| |\  
| | * 7a5e5dd add env
| * | 7bd91f1 add new env
...
# 注意到Git用(HEAD -> master)和(origin/master)标识出当前分支的HEAD和远程origin的位置分别是582d922 add author和d1be385 init hello,本地分支比远程分支快两个提交。

标签管理

  1. 创建标签

	git checkout master # 切换到要打标签的分支
	git tag v1.0 # 创建标签
	git tag # 查看所有标签
  • 标签默认打在最新的commit,给过去的commit打标签:
	git log --pretty=oneline --abbrev-commit # 查到commit id
	git tag v0.9 f53c633
	git tag

猜你喜欢

转载自blog.csdn.net/weixin_43850377/article/details/86671609