Git Bash

本文最后更新于:2021年6月2日 下午

本文用于记录Git常用语法。

基本用法

Git Bash登录

$ git config --global user.name “Your Name” 	#(注意前边是“- -global”,有两个横线) 

$ git config --global user.email “email@example.com”

Git SSH配置

ssh-keygen -t rsa -C “email@example.com”
#全部回车
#打开.ssh文件夹下的id-rsa.pub文件的内容,复制到ssh key

Git Bash创建仓库

$ git init newrepo

$ git add README	 #将目录下以README文件提交到仓库中

$ git commit -m '初始化项目版本'	#备注功能

$ git clone <repo###  <directory###  	#repo:Git 仓库 directory:本地目录。

$ git status 	#查看项目的当前状态

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 Bash提交修改

  • 远程仓库未创建
git init 	#初始化一只本地仓库(或者基于初始化仓库建立项目vue init webpack demoxxxx)

git status 	#查看状态

git add -A 	#提交所有文件改动

git remote add origin ssh地址 	# 链接远程仓库步骤1

git push -u origin master 	#链接远程仓库步骤2

git add -A 	#提交所有文件改动

git status 	#查看状态

git commit -m "xx" 	#备注功能

git status 	#查看状态

git pull origin master 	#拉最新代码 (下载)

git push origin master 	#推送到远程 (上传)

  • 远程仓库已创建:
git clone ssh地址 	#关联远程

git remote add origin ssh地址 	#链接远程仓库步骤1

git pull origin master 	#拉最新代码 (下载)

git add -A 	#提交所有文件改动

git commit -m "xx" 	#备注功能

git push origin master 	#推送到远程 (上传)

基础命令

git add

$ git add . 	#他会监控工作区的状态树,使用它会把工作时的所有变化提交到暂存区,包括文件内容修改(modified)以及新文件(new),但不包括被删除的文件。

$ git add -u 	#他仅监控已经被add的文件(即tracked file),他会将被修改的文件提交到暂存区。add -u 不会提交新文件(untracked file)。(git add --update的缩写)

$ git add -A 	#是上面两个功能的合集(git add --all的缩写)

# 添加指定文件到暂存区(追踪新增的指定文件)
$ 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 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 pull push

# 将本地仓库的文件推送到远程分支
# 如果远程仓库没有这个分支,会新建一个同名的远程分支
# 如果省略远程分支名,则表示两者同名
$ 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

Git merge

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

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

$ git merge --squash 

Git Bash分支管理

$ git branch (branchname) 	#创建分支命令

$ git checkout (branchname) 	#切换分支命令

$ git merge 	#合并分支

$ git branch 	#列出分支

$ git branch -d (branchname) 	#删除分支

# 查看本地分支
$ 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
# 将名字为xxx的分支重命名为yyy
git branch -m xxx yyy 

Git Bash查看提交历史

$ git log

$ git log --oneline 	#用 --oneline 选项来查看历史记录的简洁的版本

Git Bash创建标签

$ git tag -a v1.0 	#创建标签

$ git tag -d v1.1 	#删除标签

$ git show v1.0 	#查看此版本修改内容

# 默认在 HEAD 上创建一个标签 
$ git tag v1.0
# 指定一个 commit id 创建一个标签 
$ git tag v0.9 f52c633
# 创建带有说明的标签,用 -a 指定标签名,-m 指定说明文字
$ git tag -a v0.1 -m "version 0.1 released" 

# 查看所有标签
# 注意:标签不是按时间顺序列出,而是按字母排序的。
$ git tag

# 查看单个标签具体信息
$ git show <tagname>

# 推送一个本地标签
$ git push origin <tagname>
# 推送全部未推送过的本地标签
$ git push origin --tags

# 删除本地标签
# 因为创建的标签都只存储在本地,不会自动推送到远程。
# 所以,打错的标签可以在本地安全删除。
$ git tag -d v0.1
# 删除一个远程标签(先删除本地 tag ,然后再删除远程 tag)
$ git push origin :refs/tags/<tagname>

进阶用法

如何解决 .gitignore 不起作用问题

.gitignore 仅适用于未跟踪的文件。如果您正在跟踪,那么 .gitignore 将不适用;如果想暴力的解决,可以使用如下方法,予以修复:

git rm --cached -r .
git add .

更详细的答案,可参见: ignore-files

删除远程分支

git push origin --delete branch-name
// eg:
git push origin --delete develop

查看 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 -###  显示每次提交所引入的差异(按 补丁 的格式输出)!!!

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>

Reset

# 从暂存区撤销特定文件,但不改变工作区。它会取消这个文件的暂存,而不覆盖任何更改
$ git reset <fileName>
# 重置暂存区最近的一次提交,但工作区的文件不变
$ git reset 
# 等价于 
$ git reset HEAD (默认)
# 重置暂存区与工作区,回退到最近一次提交的版本内容
$ git reset --hard 
# 重置暂存区与工作区,回退到最近一次提交的上一个版本
$ git reset --hard HEAD^ 

# 将当前分支的指针指向为指定 commit(该提交之后的提交都会被移除),同时重置暂存区,但工作区不变
$ git reset <commit>
# 等价于 
$ git reset --mixed  <commit>

# 将当前分支的指针指向为指定 commit(该提交之后的提交都会被移除),但保持暂存区和工作区不变
$ git reset --soft  <commit>
# 将当前分支的指针指向为指定 commit(该提交之后的提交都会被移除),同时重置暂存区、工作区
$ git reset --hard  <commit>

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

ReBase

# 查看提交信息
git log
# 需要开始合并的commitID
git rebase -i commitId
# 进入编辑模式选择需要合并的方式
# 保存后退出编辑提交的信息
# 继续保存后退出提示:
# Successfully rebased and updated refs/heads/master.

Tips

$ git push origin
fatal: unable to access 'xxx': Failed to connect to github.com port 443: Timed out

$ git config --global http.sslVerify "false"

本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!