git命令入门

参考

廖雪峰git教程-推荐
git图解
分支命名规范
ps:图都是别人的

1.基本概念

区域

  • 四个区域:工作区(Working Directory)暂存区(stage/index)本地版本库(Local Repository)远程版 本库(Remote Repository)他们之间关系如下:
    在这里插入图片描述

-在这里插入图片描述

分支branch

  • 主分支(master/main)(主分支,永远是可用的稳定版本,不能直接在该分支上开发)
  • develop(开发主分支,所有新功能以这个分支来创建自己的开发分支,该分支只做合并操作,不能直接在该分支上进行开发)
  • feature-xxx(功能开发分支,在develop上创建分支,以自己开发功能模块命名,功能测试正常后合并到develop分支)
  • feature-xxx-fix(功能bug修复分支,feature分支合并之后发现bug,在develop上创建分支进行修复,之后合并回develop分支)

标签tag

  • 标签是用于标记特定的点或提交的历史,不能更改

head

  • 当做一个指针,HEAD 指向的就是当前分支的最新提交的节点;

.gitignore

官方模板,照着用就行
把不需要推送的文件放在里面,git会忽视这些文件。
比如:

.vscode/*.json

#C++
# Prerequisites
*.d

# Compiled Object files
*.slo
*.lo
*.o
*.obj

2.基本操作

  • git clone "远程仓库地址" #包含init操作;

  • git init #本地初始化一个仓库

  • git remote add origin "地址" #init 后 与远程仓库建立链接;origin是远程主机名

  • git fetch #默认取回所有分支的更新,

  • git pull (origin "远程分支名" : "本地分支名") # 完整写法;如果同名 不用写本地分支名,如果关联好了 只写git pull 即可,pull操作直接将远程仓库拉取到工作区!

  • git add "文件" #把修改的文件 加入到暂存区 git rm 和git mv 同理

  • git status #查看仓库状态 -s 参数会更简洁

  • git diff “文件名” #查看暂存区和本地仓库文件差异

  • git commit -m "第一行说明" -m “第二行说明” # 提交到仓库 ,-am 多行提交原因

  • git log (--pretty=oneline) # 查看提交历史记录git log --graph --pretty=oneline --abbrev-commit常用这个

  • git reset --hard HEAD~n/commit_id # 回退到某个版本,会修改工作区暂存区、版本库;soft保留工作区和暂存区,mixed保留工作区;

  • git branch -a/-r #查看分支/远程仓库分支 -d/-D “分支名”删除/强制删除分支

  • git checkout -b '分支名' #基于当前所在分支创建新分支并切换到新分支; 等价于 git branch 'dev' +git switch 'dev'

  • git push -u origin "本地分支名" # 将本地分支和远程同名分支关联;如果远程没有该分支,则在远程创建该分支。

  • git push origin -d "分支名" # 删除本地和远程仓库分支,branch -r -d origin/分支名只是删除追踪分支

  • git merge "分支名" --no-ff # 合并某分支到当前分支,并且不使用快速合并,保留信息

  • git push origin “本地分支名”:"远程分支名" # 将本地仓库推到远程仓库;

3.命令说明(慢慢整理)

命令:
/add / commit /merge
/fetch /push /pull
/remote /branch /checkout
/rebase /stash /git cherry-pick
/reset /revert /restore
/log /relog /diff

3.1 add/rm/mv

使用git rm/mv 相当于先 rm/mv 在git add添加;

git add -f/--force  #强制添加某文件,可用于添加在.gitignore中的文件

3.2 push/pull/fetch

pull = fetch+merge

#同步远程仓库到本地仓库
git fetch "分支名"

# 关联到同名远程库,没有则创建同名远程库
git push -u origin <本地分支名> 
#关联后 :
git push   
git pull
#未关联推送到同名库
git push origin <本地分支名>       
git pull origin <远程分支>  #不要反了!!
#完整命令: 
git push origin <本地分支名>:<远程分支名>
git pull origin <远程分支名>:<本地分支名>

# 删除远程仓库 
git push origin -d "分支名" 

3.3 remote/

关于远程仓库操作

git remote add "远程主机名默认origin" "地址"
git remote -v  #显示链接的远程仓库

3.4 stash

将工作保存在栈中,

git stash 
git stash list
git stash pop
git stash apply ID
git stash drop  ID

3.5commit/merge/cherry-pick

git commit "文件" -m "说明1" -m "说明2" 

git merge "分支名" #默认快速合并
git merge -no-ff -m "merge fix bug 01"  #推荐方式

git cherry-pick commitHash #合并其他分支上的某次提交

3.6 log/reflog

log 可选参数很多

git log  --pretty=oneline #单行显示
git log --graph        # 图
git log -5        # 显示最近5次提交

3.7 diff

3.8 branch/switch/checkout

checkout命令在早期版本中具有分支管理和文件恢复两个核心功能,但这些功能在2.23版本之后被分化为switch和restore两个独立命令。因此,如果您只需要创建和切换到新分支(不需要检出文件或撤销更改等),建议使用switch命令。switch命令可以更好地保证分支操作的安全性,因为它禁止在未提交的更改上切换分支(除非使用 --discard-changes 选项丢弃更改)

git branch -m <branch-name> #重命名
git branch <branch-name> #创建新分支
git branch -a #查看所有分支
git branch -v # 查看远程分支
git branch #查看
git branch -r -d/-D "分支名" #删除跟踪分支、本地分支;想删除远程分支要使用push  -r就是 --remote

git switch branch #切换分支
git switch -c newbranch  (ori_branch) #创建并切换到新的分支
git checkout -b newbranch (ori_branch) #创建并切换到新的分支

3. restore/reset/revert

Git Reset 三种模式

restore命令用于恢复工作区的文件。它可以将文件从暂存区(index)或提交(commit)中还原到工作区。
reset本质是 重置/移动HEAD指向的节点(连带着branch)。
revert 原理是通过提交新的从而覆盖之前的问题

git restore <file>
git restore <file> --source=HEAD  #将文件从暂存区还原到工作区。
git restore <file> --source=<commitHash> #将文件从指定提交中还原到工作区。

git reset --hard HEAD^/HEAD~n/commitHash   #回退到某个节点,工作区暂存区本地仓库全部回退
git reset --mixed ... # mixed也是默认参数,只对暂存区和本地仓库有影响,保留工作区内容
git reset --soft  ...#只对仓库有影响,暂存区和工作区都保留(应该说暂存区会存放重置HEAD带来的差异)

git revert commitHash

4.练习

都是简单问题,必须要掌握

4.1 同步/多人协作

你在本地仓库工作,现在远程仓库更新了,你该怎样同步更新,并继续你的工作?

git fetch origin   #获取远程库更新内容到本地仓库
#如果 不影响你的工作,那就不用 合并,反之需要合并 
git switch "工作分支"
git merge origin/"要合并的branch"  # 如果有冲突,要先解决冲突;git pull 等价于 fetch+merge?
#之后正常操作
git add ..
git commit -m ""
git push origin "本地分支"

4.2 bug分支

dev或者master上发现bug 怎么修改:本地创建分支bug_fix007,修改后合并到主分支上

git checkout -b bug_fix007 dev
#修改完毕后
git push -u origin bug_fix007   #创建远程同名分支并推送,
#or
git switch dev
git merge  bug_fix007 -m "merge bug_fix007" 

你当前工作未完成,但是此时需要你去处理代码中其他的问题,比如修复一个bug或者马上要提交另一个分支,或者多人协作时,当前工作未完成,为了避免和别人冲突,需要将改动暂时存储起来,怎么办?

#使用stash将未提交的文件保存在栈里面,此时使用git status 会发现工作区变干净了
git stash 
git switch master  #切换到需要修改的分支上
git branch -m issue-01  #在dev分支晌创建临时分支issue-01
git add
git commit -m "fix bug 01"
git switch dev
git merge -no-ff -m "merge fix bug 01" #bug修改完
git switch dev  #回到之间的工作
git status    #干净的工作区
git stash list  #查看栈,
git stash apply (stash@{n}) #恢复内容,stash内容不删,默认是栈顶,也可以指定 n,n通过list查看。
git stash drop #删除stash的内容  也可直接使用 pop出栈

此时存在一个问题,那就是dev也是从master来的,所以这个bug dev上面也有,那怎么快速解决该问题?

git cherry-pick commitHash

其他解决方式:先用git stash保存未完成工作; 然后在dev上修复这个bug,
关于stash其他操作还有很多,注意的是stash只能保存那些已经被追踪的文件,如果你新建了一个文件,没有add,那么不会被跟踪,stash无效,在其他分支也是可以看到的。

4.3 回退

如果发现提交的内容有错误,可能是在暂存区中,也有已经提交到本地仓库中的,怎么办;

# 如果是在暂存区中:
git restore --staged <文件>...   # git status 会自动提示 取消暂存
# 如果已经提交到仓库 那么两种办法:一种是commit提交修改后的,但是会又提交记录;第二种是使用reset,这样在log中就不会出现。
git log #查看commit记录
git reset --hard HEAD^/HEAD~n/commitID   #回退到某个节点,工作区暂存区本地仓库全部回退
git reset --mixed  # mixed也是默认参数,只对暂存区和本地仓库有影响,保留工作区内容
git reset --soft  #只对仓库有影响,暂存区和工作区都保留(应该说暂存区会存放重置HEAD带来的差异)

你想要撤回提交到远程库的内容。其他不关心,如何操作

git pull
git reset --hard/soft/mixed HEAD^
git push -f   #强行推送

你想要撤回提交到远程库的内容。这时可能会想到用 reset 回退,可是你看了看分支上最新的提交还有其他同事的代码,用 reset 会把这部分代码也撤回了,此时怎么办?

git pull 
git log -10  #查看最近十次commit 找到自己提交的哈希值
git revert commit_id  #创建一个新的提交,来弥补之前的错误
git revert -m 1 <commitHash>  #有时出现不知道哪个是主线,则使用该命令  遇到再说

如果误用了reset --hard或者记错了commitHash,怎么办

git reflog  # 强力后悔药,查找命令记录,找到错误提交的那次 commitHash /
git reset --hard commitHash

4.4分支问题

使用git clone 时,默认只能看到本地的master分支,如果想要在dev分支上开发怎么办?

git clone ""
git branch  #发现只有master
git checkout -b dev origin/dev #创建远程origin的dev分支到本地
# 在本地修改后 推送
git branch --set-upstream-to=origin/dev dev #链接本地和远程分支,push/pull失败后git会提示,
git push origin dev  #

如果本地创建一个分支,远程没有,想要把本地推送到远程同名仓库

git checkout dev  
git checkout -b feature_01  #从dev上创建一个新的分支feature_01
git push -u origin feature_01  
#这条命令的作用是将本地的 feature_01 分支推送到远程仓库(origin)的 feature_01 分支。
#同时,如果远程仓库还没有 feature_01 分支,这条命令会自动创建。-u 参数表示设置 dev 分支为默认推送分支。

远程origin/dev 分支太落后,怎么更新

git switch master
git pull
git checkout -b dev origin/dev #创建本地分支
git merge master -m "update dev"  #合并
git push  (-f origin dev:origin/dev)  #推送

5 补充知识

5.1关于commitHash

git reflog发现几次命令历史的commithash一样 \

- git reflog可以发现多次命令历史的commit hash一样,是因为它们对应的是同一个提交。
每次提交都会生成一个独特的commit hash,这个hash是根据提交的内容和其他相关信息计算出来的。
因此,如果在不同的分支或操作中,提交的内容完全相同,那么它们生成的commit hash也会一样。

- 例如,如果在某个分支上进行了多次提交,然后在另一个分支上又进行了相同的提交,
那么这两个提交的commit hash就会一样。这是因为它们对应的都是同样的提交内容。

- 另外,git reflog可以查看所有分支的所有操作记录,包括commit和reset的操作,可以用来恢复误删的分支或找回丢失的提交。
其中,commit记录包含了提交的完整信息,而reset记录则表示将HEAD指针移到了之前的某个提交。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值