Git 速成笔记

这篇博客详细介绍了Git的基本操作,包括查看状态、提交、分支管理、合并、解决冲突等,重点讲解了如何将代码推送到远程仓库、回退版本、处理分支合并冲突,以及多人协作的最佳实践。
  • 主要有三块区域:工作区/暂存区/远程仓库
  • 工作区可以理解是平时代码编辑的地方
  • 暂存区可以理解是git add之后的地方
  • 远程仓库可以简单理解为git push 后的地方
  • git commit后会在本地新增一个节点

00 HEAD

- Git中有一个名为 HEAD 的特殊指针,它是一个指针,指向当前所在的本地分支(可以将 HEAD想象为当前分支的别名)

01 查看状态

- git status

02 把工作区文件放到暂存区文件

- git add .  # 点表示匹配当前目录下的所有改动的文件
- git add <file_name1>  <file_name2>  # 定向添加某个文件,或多个文件,以空格分隔
- git add <path>/*  # 通配符,表示匹配path路径下的所有文件

03 把暂存区文件提交到远程仓库中:注:注释可以通过单引号来换行’’

- git commit -m <info_message>

04 查看提交记录(commit记录)

- git log  # 默认查看所有
- git log  --author="vegazhang"  # 查看指定用户的git提交记录

05 配置用户名和邮箱

- git config --global user.name "vegaviazhang"  # 最好和github一致
- git config --global user.email "vegazhang@fox.com"  # 最好和github一致
- git config --global --list  # 可以查看到配置的信息

06 删除文件

- 1) 资源管理器直接右键删除;然后再git add <file_name>
- 2) 或者命令行直接使用如下命令: git rm <file_name>

07 重命名文件

- 1) 资源管理器右键修改文件名
- 2) 或者命令行直接使用如下命令: git mv <old_file_name> <new_file_name>

08 移动文件到其他未知

- 1) 资源管理器拖拽
- 2) 或者命令行直接使用如下命令: git mv <file_name> <folder_name(文件夹名)>

07/08放一起 (移动并重命名):

- 命令行:git mv <old_file_name> <folder_name>/<new_file_name>

09 查看具体某次提交时,某个文件前后的变化

- 方法1):
    (1) 要先拿到具体某次提交的id
        git log --pretty=oneline <file_name>  # 某个具体文件的提交日志,并在一行上显示,拿到行首的字符串,也就是提交的id
    (2) 使用命令显示某次某个文件提交前后的具体变化
        git show <commit_id>
- 方法2):查看该文件的改动,上级及之前的版本改动
    (1) git log -p <file_name>

-【fyi】:**【
- 改动后文件,
    - 如果文件没有被添加到暂存区,一般为红色
    - 如果文件已经添加到暂存区,一般位绿色
- 】**

10 恢复某个文件的改动(即与上一次提交的状态保持一致)(******)

- 注:此时这个文件并没有被添加到暂存区,即没有使用git add <file_name>,才可以使用,add之后文件的处理看下面11
- git checkout -- <file_path/file_name>

11 撤销某个文件的追踪【重点关注】

- 注:应用场景:已经被git add 的文件撤销其追踪,然后可以使用10中git checkout -- <file_path/file_name>
- git reset HEAD <file_path/file_name>
- 此时的颜色恢复到红色
- 再使用10中的git checkout -- <file_path/file_name>

12 将所有文件的代码(即整个项目)回到上一个版本或者指定版本【重点关注】【慎重使用】

- <font size="4" color="blue">此方法会使本地工作区的代码一并改变,慎重</font>
- 方法1):回退到附近的版本
    (1) git reset --hard HEAD^  # 一个尖括号:表示回到上一个版本
    (2) git reset --hard HEAD^^  # 2个尖括号:表示回到上两个版本
- 方法2):利用<commit_id>,回退到指定的版本(可以回到上1,2,3,50,100,1000个版本。。。)
    step1:git log # 获取想要回到的<commit_id>
    step2:git reset --hard <commit_id>

13 将指定文件回退到指定版本【重点关注】

- git checkout <commit_id> -- <file_name>

14 将修改的内容推送到远程仓库【重点关注】

- 推送到远程仓库命令形式:git push <远程主机名> <本地分支名>  <远程分支名>
- 例如:git push origin master:refs/for/master
- 上述命令即是将本地的master分支推送到远程主机origin上的对应master分支, origin 是远程主机名,第一个master是本地分支名,第二个master是远程分支名。
- 下面具体来看以下几种形式:
- 1) git push origin <branch_name> # 如果远程分支被省略,则表示将本地分支推送到与之存在追踪关系的远程分支(通常两者同名),如果该远程分支不存在,则会被新建
- 2) git push origin :refs/for/master #如果省略本地分支名,则表示删除指定的远程分支,因为这等同于推送一个空的本地分支到远程分支,等同于 git push origin --delete master
- 3) git push origin # 如果当前所在分支与远程分支存在追踪关系,则本地分支和远程分支都可以省略,将当前分支推送到origin主机的对应分支
- 4) git push  # 如果当前分支只有一个远程分支,那么主机名都可以省略,形如 git push,可以使用git branch -r ,查看远程的分支名
- 5) git push -u origin <branch_name>  # 如果当前分支与多个主机存在追踪关系,则可以使用 -u 参数指定一个默认主机,这样后面就可以不加任何参数使用git push

15 给每个版本创建一个独特标签,并做版本标签管理

- git tag # 不添加任何参数,显示所有的标签
- git tag <tag_name>  # 默认添加标签到最新一次的commit上面,可以通过git log 查看添加上的标签
- git tag <tag_name> <commit_id> # 针对某次提交添加标签
- git tag -d <tage_name>  # 删除标签,需要给出标签名这个参数
- git push origin <tag_name>  # 将标签推送到远程仓库

分支模块:多人开发

16 创建、删除、切换分支的操作:以下branch_name表示分支名称【重点关注】

- 注:这里的删除分支指的是删除本地的分支,删除远程分支看21
- 创建分支:git branch <branch_name>
- 显示本地分支:git branch  # 注:带星号的是当前所在分支
- 切换到指定分支:git checkout <branch_name>
- 删除本地指定分支:git branch -d <branch_name>   # 注:(1)不能删除当前所在分支;(2)分支有提交代码(有commit操作),则也不能删除
- 创建并切换到该分支:git checkout -b <branch_name>

17 将开发分支(eg:dev_vega)的代码合并到主线(eg:master)中去,并且开发分支的代码要不受影响【重点关注】

- step0:目前在开发分支(dev_vega)上,并且写好所有代码
- step1:开发分支(dev_vega)需要commit:git commit -m "message"
- step2:切换到合并到的分支(master)上去:git checkout master
-   注:当前所在分支为主线分支(master)
- step3:把开发分支上的代码合入:git merge dev_vega

18 合并分支时有冲突的处理【重点关注】

- fyi(for your infomation,场景描述):还是要将开发分支(eg:dev_vega)的代码合并到主线(eg:master)中去,但是两个分支中同时修改了一个地方,
- master主线中改了某个文件某一个位置的代码并且commit了,开发分支dev_vega也改了这个地方的代码也commit了,这时若将dev_vega开发分支的代码合并到
- 主线master中,(也就是按照17进行操作),就会出现冲突:提示如下错误
- 【CONFLICT (content):Merge conflict in <file_name>. Automatic merge failed; fix conflicts and then commit the result.】
- 此时到该文件<file_name>中会发现如下问题:
```
    <<<<<<<<<<< HEAD  # (这里改的也就是当前分支(master)的对该处的修改)
        <update by master>
    ===========
        <update by dev_vega>
    >>>>>>>>>>> dev_vega  # # (这里改的也就是要dev_vega(git merge <branch_name>:即merge之后的分支名)的对该处的修改)
```
- 合并分支时提示有冲突,此时有两种方法:
- 方法1):
-   step1:17当中的操作
-   step2:(忽略其它分支,保留当前所在分支)直接保存当前所在分支的代码,丢弃到[git merge]后分支的代码: git merge --abort
- 方法2):
-   step1:17当中的操作
-   step2:将界面切换到冲突的文件中,将这两份代码进行修改,选择合适的进行保留
-   step3:通过git status查看一下当前状态,会出现以下两行提示:git status
-       your have unmerged paths.(fix conflicts and run "git commit")(use "git merge --abort" to abort the merge)
-       unmerged paths:(use "git add <file>..." to mark resolution) both modified:<file_name>
-   step4:将修改冲突后的代码添加到当前所在分支(master)的缓存区:git add <file_name>
-   step5:直接使用代码,不需要添加参数:git commit
-       此时,系统弹出一个可以编辑页面,用法同linux中的vim,可以简单输入上述step2中处理过程的方法
-   step6:此时再查看状态,不会再有both modified的提示:git status
-   step7:再提交代码:git commit -m "解决冲突后的代码"
-   step8:再使用git push可以推送到远程仓库

分支模块:git多人分支集成协作时的常见场景

19 不同人想要查看版本路线如何进行操作

- git log --oneline --graph

20 远程/本地:一些基本的命令

- git branch # 查看本地分支
- git branch -r # 查看远程分支
- git branch -a # 查看所有(远程+本地)分支
- git branch -v # 查看各个分支最后一个提交信息
- git branch --merged # 查看哪些分支已经合并入当前分支

21 日常下拉代码更新操作

- 需要使用到git fetch 和git merge
- git merge 命令是用于从指定的commits(即merge参数后指定的)合并到当前所在分支的操作
-   例如:要将master分支上的v22,v32,v42这些commits的代码合并到dev分支上
- step1:先要拉取远端master分支的代码:git fetch origin master
- step2:当前要把master中v42的代码合并到当前所在分支上,示意图如下:
-          v21-v31-41  (dev)    <-当前所在分支
-         /
-    v1-v2-v22-v32-v42  (master)
- step3:这时使用:git merge master


- 拉取远端仓库代码:git fetch origin <branch_name>
- 例如:拉取远端上develop分支的代码:git fetch origin develop
-     拉取远端master分支的代码:git fetch origin master
- 该命令执行完后需要执行 git merge 远程分支到你所在的分支
- 【从远端仓库提取数据并尝试合并到当前分支:git merge】

22 首次建分支时推荐使用:【重点关注】

- git checkout -b <branch_name_vega> origin/<remote_branch_name_master>
- 以上命令有以下3个作用:
- 1)在本地新建一个分支 branch_name_vega
- 2)将远程分支 remote_branch_name_master的代码拉到本地
- 3)同时切换到新建的分支 branch_name_vega

23 删除不想要的远程分支

- 注:删除前要确认待删除的远程分支不再需要(代码已经合并、废弃等确实不用了)
- git push origin -d <branch_name> # 注:该操作不会删除本地的同名分支,如有需要:git branch -d <branch_name>

24 不同人修改了不同文件导致push失败【重点关注】

- fyi:当其他人修改代码,并已经提交并推送到远程仓库中;如果此时自己也修改了代码,并且也想要提交到同一仓库中,即如下操作
- step0:git fetch # 拉取远程仓库到本地
- step1:git add <file_name>  # 添加修改的文件到暂存区
- step2:git commit -m <message> # 提交
- step3:git push # 推送到远程仓库,此时会有如下错误出现,并终止push(即无法push)
-   ![rejected] <branch_name>-><branch_name> (non-fast-forward)
-   error:failed to push some refs to "https://github.com/xxxxxx/xx.git/"
-   hint:Updates were rejected because the tip of your current branch is behind
-   hint:its remote counterpart.Interate the remote changes(e.g.
-   hint:'git pull ...') before pushing again.
-   hint:See the "Note about fast-forwards' in 'git push --help' for details
- step4:这时需要先进行merge一下远程仓库拉下来的代码(意思就是把代码合并到当前分支,后面代码中的branch_name参数是被拉下来合要被当前分支的分支):git merge origin/<branch_name>
-   此时可以输入一些改动信息
- step5:最后再输入:git push

25 模拟正常情况下不同人修改相同的文件过程【正常使用】

- fyi:现远端有一个分支develop,A需要将这个分支拉到本地,修改后提交并推送到远端
-       step0:git branch -av # 查看远端与本地所有分支,并显示最后一次提交信息,选择目标的分支,这里以remotes/origin/develop为例# 【仅第一次建分支时使用,后续提交操作不需使用】
-       step1:git checkout -b dev_A remotes/origin/develop  # 创建并切换到dev_A分支,并与远端develop产生关联,后续推送git push 表示推送到该远端分支 # 【仅第一次建分支时使用,后续需要使用git merge】
-       step2:修改文件
-       step3:git add <file_name>
-       step4:git commit -m A做的修改
-       step5:git push # 推送到远端develop
- fyi:B也需要对该分支的文件进行修改
-       step6:拉取远端所有分支及改动:git fetch
-       step7:git branch -av    # 【仅第一次建分支时使用,后续提交操作不需使用】
-       step8:git checkout -b dev_B remotes/origin/develop # 【仅第一次建分支时使用,后续需要使用git merge】
-       step9:修改文件
-       step10:git add <file_name>
-       step11:git commit -m B的修改
-       step12:git push

26 多人开发下推荐使用【git fetch】 + 【git merge】,而不是【git pull】【重点关注】

- git pull的原理:https://www.cnblogs.com/ruiyang-/p/10764711.html
- 【git pull的问题是它把过程的细节都隐藏了起来,以至于你不用去了解git中各种类型分支的区别和使用方法。当然,多数时候这是没问题的,但一旦代码有问题,你很难找到出错的地方】
- 【将下载(fetch)和合并(merge)放到一个命令里的另外一个弊端是,你的本地工作目录在未经确认的情况下就会被远程分支更新】
- 宁愿做的慢一些,也不愿意返工重来

27 新建仓库并初始化

- 不会经常使用,将新建仓库并初始化的其中一种做法介绍如下:
- step1:安装git【若使用windows需要安装git for windows】,注:这里可以使用vscode等IDE工具
- step2:先在github或者gitlab页面新建一个仓库,此时会有【The repository for this project is empty】的提示
- step3:在本地新建一个文件夹,名称建议与仓库名保持一致
- step4:进入新建的文件夹,右键菜单【Git Bash Here】
- step5:初始化一个仓库:git init
- step6:可以添加一些文件:git add .  # . 表示当前文件夹下的所有文件
- step7:提交:git commit -m 初始化仓库
- step8:回到浏览器中仓库的页面,复制下面类似下面一行代码(意思就是产生关联):git remote add origin git@192.168.2.246:vega/demand_vega.git
- step9:推送代码,并指定一个默认主机产生关联,此后可以直接使用【git push】:git push -u origin master

28 合并分支

参考:https://blog.youkuaiyun.com/qq_42780289/article/details/97945300

情景1:没有修改相同的文件

- 场景介绍:当前在dev_vega分支,需要将dev_vega分支上的代码合并到开发分支develop分支上

- step1:在dev_vega分支改完代码commit后[git add <changed files>;git commit -m <message>]
- step2:git checkout develop : 切换分支到develop
- step3:git pull origin develop : 将远程origin分支的最新代码拉下来,
- step4:git merge dev_vega :将dev_vega分支合并到当前分支develop中
- step5:git push origin HEAD : 将当前develop分支合并到远程的同名develop分支中

情景2:修改相同的文件

- 场景介绍:当前在dev_vega分支,需要将dev_vega分支上的代码合并到开发分支develop分支上,同时,develop分支已经发生了另一次提交,并且与dev_vega分支改了相同的文件,vega在不知道的情况下也采用上面的step1-step4方法进行合并
- step1:在dev_vega分支改完代码commit后[git add <changed files>;git commit -m <message>]
- step2:git checkout develop : 切换分支到develop   # 20210728 git checkout -b develop origin/develop 
- step3:git pull origin develop : 将远程origin分支的最新代码拉下来,
- step4:git merge dev_vega :将dev_vega分支合并到当前分支develop中
- 注:此时会发现,合并是失败的,Git 做了合并,但是没有自动地创建一个新的合并提交。
-  Git 会暂停下来,等待你去解决合并产生的冲突。 你可以在合并冲突后的任意时刻使用
-  git status 命令来查看那些因包含合并冲突而处于未合并(unmerged)状态的文件:
	$ git status
	On branch develop
	You have unmerged paths.
	  (fix conflicts and run "git commit")
	  (use "git merge --abort" to abort the merge)
	
	Unmerged paths:
	  (use "git add <file>..." to mark resolution)
	
	        both modified:   test-1.txt
	
	no changes added to commit (use "git add" and/or "git commit -a")
- step5: 任何因包含合并冲突而有待解决的文件,都会以未合并状态标识出来。
-  Git 会在有冲突的文件中加入标准的冲突解决标记,这样你可以打开这些包含冲突的文件然后手动解决冲突。 
- 出现冲突的文件会包含一些特殊区段,看起来像下面这个样子
	This is test-1.
	update test-1.
	add test-1.
	<<<<<<< HEAD
	test develop.
	=======
	test dev_vega.
	>>>>>>> dev_vega
- step6:里 HEAD 表示所指示的版本(也就是你的 develop 分支所在的位置,
- 因为你在运行 merge 命令的时候已经检出到了这个分支)在这个区段的上半部分(======= 的上半部分),
- 而 dev_vega 分支所指示的版本在 ======= 的下半部分。 为了解决冲突,
- 你必须选择使用由 ======= 分割的两部分中的一个,或者你也可以自行合并这些内容。 
- 例如,你可以通过把这段内容换成下面的样子来解决冲突:
	This is test-1.
	update test-1.
	add test-1.
	test develop.
	test dev_vega.
- step7: 然后手动提交
	$ git add fix_conflict_file  # 这里加上冲突的文件
	$ git commit -m "fix_conflict"
	[develop f7daa6b] fix_conflict

29 纯手写,另水平有限,欢迎指正

30 亲,最好看的你,觉得还不错的, 点个赞,给个关注吧,蟹蟹

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值