Loading

git 常见的操作全解

强烈推荐这个网站!!!里面有各种git工具、教程和常用命令的总结:

https://gitee.com/all-about-git

git 操作图解

image

配置

# 查看提交代码时的用户信息
$ git config user.name
$ git config user.email

# 设置提交代码时的用户信息,--global代表全局生效,否则只对当前项目生效
$ git config --global user.name "[name]"
$ git config --global user.email "[email address]"

代码提交

# 添加指定文件到暂存区
$ git add [file1] [file2] ...

# 添加指定目录到暂存区,包括子目录
$ git add [dir]

# 添加当前目录的所有文件到暂存区
$ git add .

# 提交暂存区到仓库区
$ git commit -m [message]

# 提交暂存区的指定文件到仓库区
$ git commit [file1] [file2] ... -m [message]

# 提交工作区自上次commit之后的变化,直接到仓库区
$ git commit -a

分支(branch)

# 列出所有本地分支
$ git branch

# 列出所有远程分支
$ git branch -r

# 列出所有本地分支和远程分支
$ git branch -a

# 新建一个分支,但依然停留在当前分支
$ git branch [branch-name]

# 切换到指定分支,并更新工作区
$ git checkout [branch-name]

# 新建一个分支,并切换到该分支
$ git checkout -b [branch]

# 从 start point 分支处新建一个分支,并切换到该分支;
# start point省略则从当前分支切出一支新分支
$ git checkout -b <new_branch> [<start point>]

# 从远程dev/1.5.4分支取得到本地分支/dev/1.5.4
$ git checkout -b dev/1.5.4 origin/dev/1.5.4

# 删除分支
$ git branch -d [branch-name]

# 删除远程分支
$ git push origin --delete [branch-name]

查看信息

# 显示有变更的文件
$ git status

# 显示暂存区和工作区的差异
$ git diff

# 显示工作区与当前分支最新commit之间的差异
$ git diff HEAD

# 显示当前分支的版本历史
$ git log

# 显示指定分支的版本历史
$ git log [branch-name]

# 一行显示一次提交,commit-id只显示前7位
$ git log --oneline

# 一行显示一次提交,显示完整的commit-id
$ git log --pretty=oneline

# 以版本的结点树形式显示指定分支的版本历史
$ git log --graph --oneline [branch-name]

# 以版本的结点树形式显示指定分支的版本历史
$ git log --graph [branch-name]

# 说明:
# --decorate 标记会让git log显示每个commit的引用(如:分支、tag等)
# --oneline 一行显示
# --simplify-by-decoration 只显示被branch或tag引用的commit
# --all 表示显示所有的branch,这里也可以选择,比如我只想显示分支ABC的关系,则将--all替换为 [branch-name...]
$ git log --graph --decorate --oneline --simplify-by-decoration --all

远程同步

注意,分支推送顺序的写法是<来源地>:<目的地>,所以git pull是<远程分支>:<本地分支>,而git push是<本地分支>:<远程分支>。

# 取回远程仓库的变化,并与本地分支合并
$ git pull <远程库名> <远程分支名>:<本地分支名>

# 如果远程分支是与当前分支合并,则冒号后面的本地分支名可以省略
$ git pull <远程库名> <远程分支名>

# 合并指定分支到当前分支
$ git merge [branch]

# git pull 命令等同于先做了git fetch ,再做了git merge。即:
$ git fetch origin
$ git checkout develop
$ git merge

# 推送到远程仓库
$ git push <远程库名> <本地分支名>:<远程分支名>

# 如果省略远程分支名,则表示将本地分支推送与之存在"追踪关系"的远程分支(通常两者同名),如果该远程分支不存在,则会被新建
$ git push <远程库名> <本地分支名>

# 将目前自己本机的代码库推送到远端,并覆盖远程仓库的代码
$ git push -f <远程库名> <本地分支名>:<远程分支名>

push和pull的参考文章,这篇文章写得很全面,重点推荐!
https://www.cnblogs.com/syp172654682/p/7689328.html

理解冲突的产生

记住:冲突的产生主要是由要合并的两个分支的结点树(一个结点对应一个commit)决定的,而不是由这两个分支的代码差异决定。
尤其是本地push远程或者本地pull远程的代码时候,一定要仔细对比本地的结点树和远程的结点树,判断出冲突是否会产生!

例一:

如下图所示,由于master分支的结点树为A->B->C,而dev分支的结点树为A->B->C->D,显然两者的版本树没有冲突,直接把master指向dev的当前提交就完成了合并。(这里冲突并不会由C和D的代码差异引起,由于两者的结点树没有冲突,所以冲突就不会产生,最后合并后的结果指向的是D,不管D有没有修改或者删除C的代码)。

合并之后可以把dev分支删除。

image

例二:

如下图所示,由于master分支的结点树为A->B->C->D,而dev分支的结点树为A->B->C->E,由于结点树不一致,这种情况下,Git无法执行“快速合并”,只能试图把各自的修改合并起来,但这种合并就可能会有冲突,这时候不能直接合并的时候就需要人工解决冲突,冲突解决之后,两者都合并到了F版本结点。

合并之后可以把feature1分支删除。

image

版本回退

# 首先查看需要回退的版本的commit id 
$ git log

# 根据id回退到指定的版本(本地回退)
$ git reset --hard id

# 推送到本地到远程仓库:让远程仓库代码和你本地一样,到当前你本地的版本。(远程回退)
$ git push origin HEAD --force

参考链接:

廖雪峰 | Git教程 - 创建与合并分支:https://www.liaoxuefeng.com/wiki/896043488029600/900003767775424

廖雪峰 | Git教程 - 解决冲突:https://www.liaoxuefeng.com/wiki/896043488029600/900004111093344

posted @ 2021-08-05 20:36  拾月凄辰  阅读(147)  评论(0编辑  收藏  举报