Git基础操作

推荐练习网站:https://learngitbranching.js.org/?locale=zh_CN

Git

Git是目前世界上最先进的分布式版本控制系统。Git 是一个开源的分布式版本控制系统,方便团队协作。

工作流程
在这里插入图片描述
Workspace:工作区
Index / Stage:暂存区
Repository:仓库区(或本地仓库)
Remote:远程仓库

设置参数

Git是分布式版本控制系统,所以需要填写用户名和邮箱作为一个标识。

打开下载的git,在开始菜单中找到Git Bash打开,会弹出一个命令窗口

git config --global user.name “hanms”

git config --global user.email “hanms@163.com”

有了这个参数,表示你这台机器上所有的Git仓库都会使用这个配置,当然你也可以对某个仓库指定的不同的用户名和邮箱。

创建版本库

什么是版本库?版本库又名仓库,英文名repository,你可以简单的理解一个目录,这个目录里面的所有文件都可以被Git管理起来,每个文件的修改,删除,Git都能跟踪,以便任何时刻都可以追踪历史,或者在将来某个时刻还可以将文件”还原”。

操作非常简单,可以在任意你想要的目录下新建一个版本库,cd到该目录下,或者在该目录文件上鼠标右键在此运行git bash

git init

使用该命令把这个目录变成git可以管理的仓库,这时候你当前目录下会多了一个.git的目录,这个目录是Git来跟踪管理版本的,没事千万不要手动乱改这个目录里面的文件,否则,会把git仓库给破坏了。

将远程仓库clone到本地

git clone git@gitlab.xxx/util/hh.git

然后就可以拉取分支,修改内容,然后提交内容啦

密钥设置

如果你想具有推送(push)的权限,你要使用SSH协议去克隆远程仓库,然后通过SSH协议远程访问。

ssh-keygen -t rsa – C “hanms@163.com”

参数-t用来指定秘钥类型,默认是rsa,可以省略。-C用来设置注释文字,可以是一个邮箱。遇到配置选项,直接敲回车键,使用默认的存储路径,注意需要输入密码时,可以选择输入一个密码。

命令运行无误,就会在当前用户目录(/.ssh)下生成一对秘钥。一般放置在当前用户的家目录下:/.ssh。公钥是id_rsa.pub,私钥是id_rsa。将公钥内容全部复制,点击gitlab右上角头像setting,选择SSH Keys,将内容粘贴到Key中,Ttle随意,Expries at可以设置的久一点,省着麻烦。然后Add key就万事大吉了。

Git 常用命令

# 查看工作区和暂存区的状态
$ git status
# 将工作区的文件提交到暂存区
$ git add .
# 提交到本地仓库
$ git commit -m "本次提交说明"
# add和commit的合并,便捷写法(未追踪的文件无法直接提交到暂存区/本地仓库)
$ git commit -am "本次提交说明"
# 将本地分支和远程分支进行关联
$ git push -u origin branchName
# 将本地仓库的文件推送到远程分支
$ git push
# 拉取远程分支的代码
$ git pull origin branchName
# 合并分支
$ git merge branchName
# 查看本地拥有哪些分支
$ git branch
# 查看所有分支(包括远程分支和本地分支)
$ git branch -a
# 切换分支
$ git checkout branchName
# 临时将工作区文件的修改保存至堆栈中
$ git stash
# 将之前保存至堆栈中的文件取出来
$ git stash pop

Git 常用命令详解

查看Git信息

# 查看系统配置
$ git config --list
# 查看用户配置
$ cat ~/.gitconfig
# 查看当前项目的 git 配置
$ cat .git/config
# 查看暂存区的文件
$ git ls-files
# 查看本地 git 命令历史
$ git reflog
# 查看所有 git 命令
$ git --help -a
# 查看当前 HEAD 指向
$ cat .git/HEAD

# git 中 D 向下翻一行  F 向下翻页  B 向上翻页  Q 退出
# 查看提交历史
$ git log --oneline
          --grep="关键字"
          --graph
          --all
          --author "username"
          --reverse
          -num
          -p
          --before=  1  day/1  week/1  "2019-06-06"
          --after= "2019-06-06"
          --stat
          --abbrev-commit
          --pretty=format:"xxx"
          
# oneline -> 将日志记录一行一行的显示
# grep="关键字" -> 查找日志记录中(commit提交时的注释)与关键字有关的记录
# graph -> 记录图形化显示 !!!
# all -> 将所有记录都详细的显示出来
# author "username" -> 查找这个作者提交的记录
# reverse -> commit 提交记录顺序翻转
# before -> 查找规定的时间(如:1天/1周)之前的记录
# num -> git log -10 显示最近10次提交 !!!
# stat -> 显示每次更新的文件修改统计信息,会列出具体文件列表 !!!
# abbrev-commit -> 仅显示 SHA-1 的前几个字符,而非所有的 40 个字符 !!!
# pretty=format:"xxx" ->  可以定制要显示的记录格式 !!!
# p -> 显示每次提交所引入的差异(按 补丁 的格式输出)!!!

add

将工作区的文件添加到暂存区

# 添加指定文件到暂存区(追踪新增的指定文件)
$ git add [file1] [file2] ...
# 添加指定目录到暂存区,包括子目录
$ git add [dir]
# 添加当前目录的所有文件到暂存区(追踪所有新增的文件)
$ git add .
# 删除工作区/暂存区的文件
$ git rm [file1] [file2] ...
# 停止追踪指定文件,但该文件会保留在工作区
$ git rm --cached [file]
# 改名工作区/暂存区的文件
$ git mv [file-original] [file-renamed]

# Git 2.0 以下版本
#只作用于文件的新增和修改
$ git add .
#只作用于文件的修改和删除
$ gti add -u
#作用于文件的增删改
$ git add -A

# Git 2.0 版本
$ git add . 等价于 $ git add -A
  • 「git add .」「操作的对象是“当前目录”所有文件变更」,”.” 表示当前目录。会监控工作区的状态树,使用它会把工作区的**「所有变化提交」到暂存区,包括文件内容修改(modified)以及新文件(new),但「不包括被删除的文件」**。
  • 「git add -u」「操作的对象是整个工作区已经跟踪的文件变更,无论当前位于哪个目录下」。仅监控**「已经被 add 的文件」(即 「tracked file」),它会将被修改的文件(包括文件删除)提交到暂存区。git add -u 不会提交新文件(「untracked file」)。(「git add –update」** 的缩写)
  • 「git add -A」「操作的对象是“整个工作区”所有文件的变更,无论当前位于哪个目录下」。是上面两个功能的合集(git add –all 的缩写)。

status

# 查看工作区和暂存区的状态
$ git status

commit

# 将暂存区的文件提交到本地仓库并添加提交说明
$ git commit -m "本次提交的说明"

# add 和 commit 的合并,便捷写法
# 和 git add -u 命令一样,未跟踪的文件是无法提交上去的
$ git commit -am "本次提交的说明"

# 跳过验证继续提交
$ git commit --no-verify
$ git commit -n

# 编辑器会弹出上一次提交的信息,可以在这里修改提交信息
$ git commit --amend
# 修复提交,同时修改提交信息
$ git commit --amend -m "本次提交的说明"
# 加入 --no-edit 标记会修复提交但不修改提交信息,编辑器不会弹出上一次提交的信息
$ git commit --amend --no-edit
  • git commit –amend 既可以修改上次提交的文件内容,也可以修改上次提交的说明。会用一个新的 commit 更新并替换最近一次提交的 commit 。如果暂存区有内容,这个新的 commit 会把任何修改内容和上一个 commit 的内容结合起来。如果暂存区没有内容,那么这个操作就只会把上次的 commit 消息重写一遍。「永远不要修复一个已经推送到公共仓库中的提交,会拒绝推送到仓库」

push & pull

  • 分支推送顺序的写法是 「<来源地>:<目的地>」
# 将本地仓库的文件推送到远程分支
# 如果远程仓库没有这个分支,会新建一个同名的远程分支
# 如果省略远程分支名,则表示两者同名
$ git push <远程主机名> <本地分支名>:<远程分支名>
$ git push origin branchname

# 如果省略本地分支名,则表示删除指定的远程分支
# 因为这等同于推送一个空的本地分支到远程分支。
$ git push origin :master
# 等同于
$ git push origin --delete master

# 建立当前分支和远程分支的追踪关系
$ git push -u origin master
# 如果当前分支与远程分支之间存在追踪关系
# 则可以省略分支和 -u
$ git push

# 不管是否存在对应的远程分支,将本地的所有分支都推送到远程主机
$ git push --all origin

# 拉取所有远程分支到本地镜像仓库中
$ git pull
# 拉取并合并项目其他人员的一个分支
$ git pull origin branchname
# 等同于 fetch + merge
$ git fetch origin branchName
$ git merge origin/branchName

# 如果远程主机的版本比本地版本更新,推送时 Git 会报错,要求先在本地做 git pull 合并差异,
# 然后再推送到远程主机。这时,如果你一定要推送,可以使用 –-force 选项
# (尽量避免使用)
$ git push --force origin | git push -f origin

branch

# 查看本地分支
$ git branch | git branch -l
# 查看远程分支
$ git branch -r
# 查看所有分支(本地分支+远程分支)
$ git branch -a
# 查看所有分支并带上最新的提交信息
$ git branch -av
# 查看本地分支对应的远程分支
$ git branch -vv

# 新建分支
# 在别的分支下新建一个分支,新分支会复制当前分支的内容
# 注意:如果当前分支有修改,但是没有提交到仓库,此时修改的内容是不会被复制到新分支的
$ git branch branchname
# 切换分支(切换分支时,本地工作区,仓库都会相应切换到对应分支的内容)
$ git checkout branchname
# 创建一个 aaa 分支,并切换到该分支 (新建分支和切换分支的简写)
$ git checkout -b aaa
# 可以看做是基于 master 分支创建一个 aaa 分支,并切换到该分支
$ git checkout -b aaa master

# 新建一条空分支(详情请看问题列表)
$ git checkout --orphan emptyBranchName
$ git rm -rf .

# 删除本地分支,会阻止删除包含未合并更改的分支
$ git brnach -d branchname
# 强制删除一个本地分支,即使包含未合并更改的分支
$ git branch -D branchname
# 删除远程分支
# 推送一个空分支到远程分支,其实就相当于删除远程分支
$ git push origin  :远程分支名
# 或者
$ git push origin --delete 远程分支名

# 修改当前分支名
$ git branch -m branchname

merge

# 默认 fast-forward ,HEAD 指针直接指向被合并的分支
$ git merge

# 禁止快进式合并
$ git merge --no-ff

$ git merge --squash
  • fast-forward:会在当前分支的提交历史中添加进被合并分支的提交历史(「得先理解什么时候会发生快速合并,并不是每次 merge 都会发生快速合并」);
  • –no-ff:「会生成一个新的提交」,让当前分支的提交历史不会那么乱;
  • –squash:「不会生成新的提交」,会将被合并分支多次提交的内容直接存到工作区和暂存区,由开发者手动去提交,这样当前分支最终只会多出一条提交记录,不会掺杂被合并分支的提交历史

revert

# 生成一个撤销最近的一次提交的新提交
$ git revert HEAD
# 生成一个撤销最近一次提交的上一次提交的新提交
$ git revert HEAD^
# 生成一个撤销最近一次提交的上两次提交的新提交
$ git revert HEAD^^
# 生成一个撤销最近一次提交的上n次提交的新提交
$ git revert HEAD~num

# 生成一个撤销指定提交版本的新提交
$ git revert <commit_id>
# 生成一个撤销指定提交版本的新提交,执行时不打开默认编辑器,直接使用 Git 自动生成的提交信息
$ git revert <commit_id> --no-edit

stash

  • 能够将所有未提交的修改保存至堆栈中,用于后续恢复当前工作区内容
  • 如果文件没有提交到**「暂存区(使用 git add . 追踪新的文件)」**,使用该命令会提示 No local changes to save ,无法将修改保存到堆栈中

「使用场景:」 当你接到一个修复紧急 bug 的任务时候,一般都是先创建一个新的 bug 分支来修复它,然后合并,最后删除。但是,如果当前你正在开发功能中,短时间还无法完成,无法直接提交到仓库,这时候可以先把当前工作区的内容 git stash 一下,然后去修复 bug,修复后,再 git stash pop,恢复之前的工作内容。

# 将所有未提交的修改(提交到暂存区)保存至堆栈中
$ git stash
# 给本次存储加个备注,以防时间久了忘了
$ git stash save "存储"
# 存储未追踪的文件
$ git stash -u

# 查看存储记录
$ git stash list

在 Windows 上和 PowerShell 中,需要加双引号
# 恢复后,stash 记录并不删除
$ git stash apply "stash@{index}"
# 恢复的同时把 stash 记录也删了
$ git stash pop "stash@{index}"
# 删除 stash 记录
$ git stash drop "stash@{index}"
# 删除所有存储的进度
$ git stash clear
# 查看当前记录中修改了哪些文件
$ git stash show "stash@{index}"
# 查看当前记录中修改了哪些文件的内容
$ git stash show -p "stash@{index}"

diff

# 查看工作区和暂存区单个文件的对比
$ git diff filename
# 查看工作区和暂存区所有文件的对比
$ git diff
# 查看工作区和暂存区所有文件的对比,并显示出所有有差异的文件列表
$ git diff --stat
# 注意:
# 1.你修改了某个文件,但是没有提交到暂存区,这时候会有对比的内容
# 一旦提交到暂存区,就不会有对比的内容(因为暂存区已经更新)
# 2.如果你新建了一个文件,但是没有提交到暂存区,这时候 diff 是没有结果的	

# 查看暂存区与上次提交到本地仓库的快照(即最新提交到本地仓库的快照)的对比
$ git diff --cached/--staged
# 查看工作区与上次提交到本地仓库的快照(即最新提交到本地仓库的快照)的对比
$ git diff branchname
# 查看工作区与 HEAD 指向(默认当前分支最新的提交)的对比
$ git diff HEAD

# 查看两个本地分支中某一个文件的对比
$ git diff branchname..branchname filename
# 查看两个本地分支所有的对比
$ git diff branchname..branchname
# 查看远程分支和本地分支的对比
$ git diff origin/branchname..branchname
# 查看远程分支和远程分支的对比
$ git diff origin/branchname..origin/branchname

# 查看两个 commit 的对比
$ git diff commit1..commit2

remote

# 查看所有远程主机
$ git remote
# 查看关联的远程仓库的详细信息
$ git remote -v
# 删除远程仓库的 “关联”
$ git remote rm projectname
# 设置远程仓库的 “关联”
$ git remote set-url origin <newurl>

checkout

# 恢复暂存区的指定文件到工作区
$ git checkout <filename>
# 恢复暂存区的所有文件到工作区
$ git checkout .

# 回滚到最近的一次提交
# 如果修改某些文件后,没有提交到暂存区,此时的回滚是回滚到上一次提交
# 如果是已经将修改的文件提交到仓库了,这时再用这个命令回滚无效
# 因为回滚到的是之前自己修改后提交的版本
$ git checkout HEAD
$ git checkout HEAD -- filename
# 回滚到最近一次提交的上一个版本
$ git checkout HEAD^
# 回滚到最近一次提交的上2个版本
$ git checkout HEAD^^

# 切换分支,在这里也可以看做是回到项目「当前」状态的方式
$ git checkout <当前你正在使用的分支>
# 切换到某个指定的 commit 版本
$ git checkout <commit_id>
# 切换指定 tag
$ git checkout <tag>

cherry-pick

「将指定的提交 commit 应用于当前分支」(可以用于恢复不小心撤销(revert/reset)的提交)

$ git cherry-pick <commit_id>
$ git cherry-pick <commit_id> <commit_id>
$ git cherry-pick <commit_id>^..<commit_id>
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值