git bash

参考网站

黑料吃瓜在线永久_git bash_terminal.external.windowsexec-CSDN博客 - D8小说网

创建版本库 - 廖雪峰的官方网站

在vs code中使用git bash

Git Bash提供了一种方式可以在Windows下执行Linux命令,如何将其结合在VSCode中使用呢?

两种方式:

1. 将 Git bash目录比如D:\Git\bin 添加到环境变量中,就可以在VSCode终端输入bash进入git的bash模式了;

    同理,在bash模式下输入cmd即可返回默认cmd模式。 

2. 也可以设置默认使用bash模式,就可以编辑用户设置文件,直接搜索“terminal.external.windowsExec”,改为以下即可:

    “terminal.external.windowsExec”: “D:\\Git\\git-bash.exe”

  但第二种方法 bash模式开了个独立窗口,并未显示在VSCode内部,有些不方便,因此还是推荐第一种方式。

指令

// 创建文件夹
// 如果你使用Windows系统,为了避免遇到各种莫名其妙的问题,请确保目录名(包括父目录)不包含中文
$ mkdir learngit 

// 进入文件夹
$ cd learngit

// 查看当前文件夹路径
$ pwd

// 通过git init命令把这个目录变成Git可以管理的仓库
// 瞬间Git就把仓库建好了,而且告诉你是一个空的仓库(empty Git repository),多了一个.git的目录,这个目录是Git来跟踪管理版本库的,没事千万不要手动修改这个目录里面的文件
// 如果你没有看到.git目录,那是因为这个目录默认是隐藏的,用ls -ah命令就可以看见。
$ git init


// 用命令git add把文件添加到仓库
// 一定要放到项目目录下(子目录也行),
$ git add readme.txt
// 被.gitignore忽略了的文件,可以用-f强制添加到Git
$ git add -f App.class


// 用命令git commit把文件提交到仓库
// -m后面输入的是本次提交的说明,可以输入任意内容,当然最好是有意义的,这样你就能从历史记录里方便地找到改动记录。
$ git commit -m "wrote a readme file"

// git log命令可以告诉我们历史记录
// 显示从最近到最远的提交日志
$ git log
// git log  --graph查看到分支的合并情况
$ git log --graph --pretty=oneline --abbrev-commit
*   cf810e4 (HEAD -> master) conflict fixed
|\  
| * 14096d0 (feature1) AND simple
* | 5dc6824 & simple
|/  




// git版本回退
// 在Git中,用HEAD表示当前版本,上一个版本就是HEAD^,上上一个版本就是HEAD^^,当然往上100个版本写100个^比较容易数不过来,所以写成HEAD~100
$ git reset --hard HEAD^

// git版本找回
$ git reset --hard 1094a(1094a是commit id)


// git reflog用来记录你的每一次命令,以便确定要回到未来的哪个版本。
$ git reflog
e475afc HEAD@{1}: reset: moving to HEAD^
1094adb (HEAD -> master) HEAD@{2}: commit: append GPL
e475afc HEAD@{3}: commit: add distributed
eaadf4e HEAD@{4}: commit (initial): wrote a readme file


// git status查看一下状态
$ git status
// 结果告诉我们,readme.txt被修改了,而LICENSE还从来没有被添加过,所以它的状态是Untracked。
On branch master
Changes not staged for commit:
  (use "git add <file>..." to update what will be committed)
  (use "git checkout -- <file>..." to discard changes in working directory)

	modified:   readme.txt

Untracked files:
  (use "git add <file>..." to include in what will be committed)

	LICENSE

no changes added to commit (use "git add" and/or "git commit -a")


// git diff HEAD -- readme.txt(要查看的文件)命令可以查看工作区和版本库里面最新版本的区别
$ git diff HEAD -- readme.txt 
diff --git a/readme.txt b/readme.txt
index 76d770f..a9c5755 100644
--- a/readme.txt
+++ b/readme.txt
@@ -1,4 +1,4 @@
 Git is a distributed version control system.
 Git is free software distributed under the GPL.
 Git has a mutable index called stage.
-Git tracks changes.
+Git tracks changes of files.

// git checkout -- file把相应文件在工作区的修改全部撤销
// 一种是文件自修改后还没有被放到暂存区,现在,撤销修改就回到和版本库一模一样的状态;
// 一种是文件已经添加到暂存区后,又作了修改,现在,撤销修改就回到添加到暂存区后的状态。
$ git checkout -- readme.txt


// 命令git reset HEAD <file>可以把暂存区的修改撤销掉(unstage),重新放回工作区
// git reset命令既可以回退版本,也可以把暂存区的修改回退到工作区。当我们用HEAD时,表示最新的版本。
$ git reset HEAD readme.txt
Unstaged changes after reset:
M	readme.txt


// git rm删除命令
$ git rm test.txt(文件名)


// github仓库关联本地仓库
// 远程库的名字就是origin,这是Git默认的叫法,也可以改成别的
// michaelliao替换成你自己的GitHub账户名
$ git remote add origin git@github.com:michaelliao/learngit.git

// 把本地库的所有内容推送到远程库上:
// 用git push命令,实际上是把当前分支master推送到远程
// 由于远程库是空的,我们第一次推送master分支时,加上了-u参数,Git不但会把本地的master分支内容推送的远程新的master分支,还会把本地的master分支和远程的master分支关联起来,在以后的推送或者拉取时就可以简化命令。
$ git push -u origin(远程分支) master(本地分支)
// 简化后的命令
$ git push origin master


// 命令git clone克隆一个本地库:
$ git clone git@github.com:michaelliao/gitskills.git

 创建与合并分支 

// git branch命令查看当前分支
// git branch命令会列出所有分支,当前分支前面会标一个*号
$ git branch
* dev
  master

// 删除dev分支
$ git branch -d dev


// 切换分支
$ git checkout 分支名
// 加上-b参数表示创建并切换,创建dev分支,然后切换到dev分支
$ git checkout -b dev


// git merge命令用于合并指定分支到当前分支
$ git merge dev(合并的分支)


 分支管理策略 
// --no-ff方式的git merge
// -m参数,把commit描述写进去。
// 合并分支时,加上--no-ff参数就可以用普通模式合并,合并后的历史有分支,能看出来曾经做过合并,而fast forward合并就看不出来曾经做过合并。
$ git merge --no-ff -m "merge with no-ff" dev
Merge made by the 'recursive' strategy.
 readme.txt | 1 +
 1 file changed, 1 insertion(+)


  bug分支  

// git stash可以把当前工作现场“储藏”起来,等以后恢复现场后继续工作
// 当手头工作没有完成时,先把工作现场git stash一下再git stash pop,回到工作现场。
$ git stash
// 创建bug分支
$ git checkout -b issue-101
// 修改bug
$ git add readme.txt 
$ git commit -m "fix bug 101"
// 合并删除bug分支
$ git merge --no-ff -m "merged bug fix 101" issue-101
// 查看stash内的缓存
$ git stash list
// 去除stash内的内容
$ git stash pop



// git stash apply恢复,但是恢复后,stash内容并不删除,你需要用git stash drop来删除
$ git stash apply stash@{0}(stash名称在stash list指令下查看)
$ git stash drop stash@{0}

// git stash pop,恢复的同时把stash内容也删了
$ git stash pop

// git stash list查看stash内容了
$ git stash list


  Feature分支  
// 创建Feature分支
$ git checkout -b feature-vulcan

// 开发Feature分支 
$ git add vulcan.py
$ git commit -m "add feature vulcan"

// 删除开发Feature分支
// -D参数表示强行删除。-d参数,如果没有分支合并会报提示,无法删除
$ git branch -D feature-vulcan


  多人协作   
// 要查看远程库的信息,用git remote
// -v显示更详细的信息:
// 如果没有推送权限,就看不到push的地址
$ git remote -v
origin  git@github.com:michaelliao/learngit.git (fetch)
origin  git@github.com:michaelliao/learngit.git (push)

// git push把该分支推送到远程库对应的远程分支上
$ git push origin(库名) master(分支名)

// 抓取分支
// 克隆项目,默认情况下,你的小伙伴只能看到本地的master分支
$ git clone git@github.com:michaelliao/learngit.git
// 要在dev分支上开发,就必须创建远程origin的dev分支到本地
$ git checkout -b dev origin/dev
// 修改dev分支
$ git add env.txt
$ git commit -m "add env"
// 提交到远程库dev分支
$ git push origin dev
// 别人也要push,先指定本地dev分支与远程origin/dev分支的链接
$ git branch --set-upstream-to=origin/dev dev
// 先pull,解决冲突,在push
$ git pull origin dev
$ git commit -m "fix env conflict"
$ git push origin dev


  Rebase  
// 使Git的提交历史不能是一条干净的直线
// 把分叉的提交历史“整理”成一条直线,看上去更直观。缺点是本地的分叉提交已经被修改过了
$ git rebase


  标签管理  
// 默认标签是打在最新提交的commit上的,v0.1是标签
$ git tag v0.1

 对特定的提交打标签
// 查看提交
$ git log --pretty=oneline --abbrev-commit
// 1094adb是commit id
// 用-a指定标签名,-m指定说明文字
$ git tag -a v0.1 -m "version 0.1 released" 1094adb

 推送某个标签到远程
// 一次
$ git push origin v1.0
// 全部提交
$ git push origin --tags

// 查看标签
git show <tagname>

 删除标签
// 本地删除
$ git tag -d v0.1
// 远程删除
$ git push origin :refs/tags/v0.9

  .gitignore  
// 查看.gitignore文件规则
$ git check-ignore -v App.class
// .gitignore的第3行规则忽略了该文件
.gitignore:3:*.class	App.class


  配置别名  
// 告诉Git,以后st就表示status
$ git config --global alias.st status
// 更改log颜色
git config --global alias.lg "log --color --graph --pretty=format:'%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr) %C(bold blue)<%an>%Creset' --abbrev-commit"

使用Windows的童鞋要特别注意

千万不要使用Windows自带的记事本编辑任何文本文件。原因是Microsoft开发记事本的团队使用了一个非常弱智的行为来保存UTF-8编码的文件,他们自作聪明地在每个文件开头添加了0xefbbbf(十六进制)的字符,你会遇到很多不可思议的问题,比如,网页第一行可能会显示一个“?”,明明正确的程序一编译就报语法错误,等等,都是由记事本的弱智行为带来的。

工作区(Working Directory)

就是你在电脑里能看到的目录,比如我的learngit文件夹就是一个工作区:

working-dir

工作区和暂存区

版本库(Repository)

工作区有一个隐藏目录.git,这个不算工作区,而是Git的版本库。

Git的版本库里存了很多东西,其中最重要的就是称为stage(或者叫index)的暂存区,还有Git为我们自动创建的第一个分支master,以及指向master的一个指针叫HEAD

git-repo

分支和HEAD的概念我们以后再讲。

前面讲了我们把文件往Git版本库里添加的时候,是分两步执行的:

第一步是用git add把文件添加进去,实际上就是把文件修改添加到暂存区;

第二步是用git commit提交更改,实际上就是把暂存区的所有内容提交到当前分支。

因为我们创建Git版本库时,Git自动为我们创建了唯一一个master分支,所以,现在,git commit就是往master分支上提交更改。

你可以简单理解为,需要提交的文件修改通通放到暂存区,然后,一次性提交暂存区的所有修改。

SSH警告

当你第一次使用Git的clone或者push命令连接GitHub时,会得到一个警告:

The authenticity of host 'github.com (xx.xx.xx.xx)' can't be established.
RSA key fingerprint is xx.xx.xx.xx.xx.
Are you sure you want to continue connecting (yes/no)?

这是因为Git使用SSH连接,而SSH连接在第一次验证GitHub服务器的Key时,需要你确认GitHub的Key的指纹信息是否真的来自GitHub的服务器,输入yes回车即可。

Git会输出一个警告,告诉你已经把GitHub的Key添加到本机的一个信任列表里了:

Warning: Permanently added 'github.com' (RSA) to the list of known hosts.

这个警告只会出现一次,后面的操作就不会有任何警告了。

如果你实在担心有人冒充GitHub服务器,输入yes前可以对照GitHub的RSA Key的指纹信息是否与SSH连接给出的一致。

git协议和https协议的区别

你也许还注意到,GitHub给出的地址不止一个,还可以用https://github.com/michaelliao/gitskills.git这样的地址。实际上,Git支持多种协议,默认的git://使用ssh,但也可以使用https等其他协议。

使用https除了速度慢以外,还有个最大的麻烦是每次推送都必须输入口令,但是在某些只开放http端口的公司内部就无法使用ssh协议而只能用https

创建分支

HEAD严格来说不是指向提交,而是指向mastermaster才是指向提交的,所以,HEAD指向的就是当前分支。

一开始的时候,master分支是一条线,Git用master指向最新的提交,再用HEAD指向master,就能确定当前分支,以及当前分支的提交点:

git-br-initial

每次提交,master分支都会向前移动一步,这样,随着你不断提交,master分支的线也越来越长:

video: http://liaoxuefeng.gitee.io/git-resources/master-branch-forward.mp4

当我们创建新的分支,例如dev时,Git新建了一个指针叫dev,指向master相同的提交,再把HEAD指向dev,就表示当前分支在dev上:

git-br-create

你看,Git创建一个分支很快,因为除了增加一个dev指针,改改HEAD的指向,工作区的文件都没有任何变化!

不过,从现在开始,对工作区的修改和提交就是针对dev分支了,比如新提交一次后,dev指针往前移动一步,而master指针不变:

git-br-dev-fd

假如我们在dev上的工作完成了,就可以把dev合并到master上。Git怎么合并呢?最简单的方法,就是直接把master指向dev的当前提交,就完成了合并:

git-br-ff-merge

解决冲突

Git is a distributed version control system.
Git is free software distributed under the GPL.
Git has a mutable index called stage.
Git tracks changes of files.
<<<<<<< HEAD
Creating a new branch is quick & simple.
=======
Creating a new branch is quick AND simple.
>>>>>>> feature1

Git用<<<<<<<=======>>>>>>>标记出不同分支的内容,如上图<<<<<<<  HEAD  ......   ======= 代表head分支上冲突的内容,<<<<<<<  feature1  ...... ======= 代表feature1分支上冲突的内容。

Git 中 SSH key 生成步骤

由于本地Git仓库和GitHub仓库之间的传输是通过SSH加密的,所以必须要让github仓库认证你SSH key,在此之前,必须要生成SSH key。

第1步:创建SSH Key。在windows下查看[c盘->用户->自己的用户名->.ssh]下是否有id_rsaid_rsa.pub文件,如果没有需要手动生成。
打开git bash,在控制台中输入以下命令。

1

$ ssh-keygen -t rsa -C "youremail@example.com"

密钥类型可以用 -t 选项指定。如果没有指定则默认生成用于SSH-2的RSA密钥。这里使用的是rsa。

同时在密钥中有一个注释字段,用-C来指定所指定的注释,可以方便用户标识这个密钥,指出密钥的用途或其他有用的信息。所以在这里输入自己的邮箱或者其他都行。

输入完毕后程序同时要求输入一个密语字符串(passphrase),空表示没有密语。接着会让输入2次口令(password),空表示没有口令。3次回车即可完成当前步骤,此时[c盘>用户>自己的用户名>.ssh]目录下已经生成好了。

第2步:登录github。打开setting->SSH keys,点击右上角 New SSH key,把生成好的公钥id_rsa.pub放进 key输入框中,再为当前的key起一个title来区分每个key。

搭建git服务器

搭建Git服务器 - 廖雪峰的官方网站

gitlab搭建:https://www.cnblogs.com/sss4/p/8412508.html

常见问题

git config 查看配置信息

参考网站:git config 查看配置信息-CSDN博客

config 配置指令
git config
  config 配置有system级别 global(用户级别) 和local(当前仓库)三个 设置先从system-》global-》local  底层配置会覆盖顶层配置 分别使用--system/global/local 可以定位到配置文件

 查看系统config

git config --system --list

查看当前用户(global)配置

git config --global  --list

 查看当前仓库配置信息

git config --local  --list

git branch --set-upstream 本地关联远程分支

git报错:

There is no tracking information for the current branch.
Please specify which branch you want to merge with.
See git-pull(1) for details.

git pull <remote> <branch>

If you wish to set tracking information for this branch you can do so with:

git branch --set-upstream-to=origin/<branch> release

原因:

使用git在本地新建一个分支后,需要做远程分支关联。如果没有关联,git会在下面的操作中提示你显示的添加关联。

关联目的是在执行git pull, git push操作时就不需要指定对应的远程分支,你只要没有显示指定,git pull的时候,就会提示你。

解决方法就是按照提示添加一下呗:

git branch --set-upstream-to=origin/remote_branch  your_branch

其中,origin/<remote_branch>是你本地分支对应的远程分支(origin不用改带表你的远程库地址,remote_branch改为你要链接的远程分支名);your_branch是你当前的本地分支。

关于git提示“warning: LF will be replaced by CRLF”终极解答(windows下载后行尾序列 LF可能会被git转为CRLF)

参考网站:关于git提示“warning: LF will be replaced by CRLF”终极解答 - 简书

一、AutoCRLF
#提交时转换为LF,检出时转换为CRLF
git config --global core.autocrlf true   

#提交时转换为LF,检出时不转换
git config --global core.autocrlf input   

#提交检出均不转换
git config --global core.autocrlf false

二、SafeCRLF

#拒绝提交包含混合换行符的文件
git config --global core.safecrlf true   

#允许提交包含混合换行符的文件
git config --global core.safecrlf false   

#提交包含混合换行符的文件时给出警告
git config --global core.safecrlf warn

解决方案:

#拒绝提交包含混合换行符的文件
git config --global core.safecrlf true 
#提交检出均不转换
git config --global core.autocrlf false

【git】git撤销与回滚(checkout  , reset  , revert)

https://www.cnblogs.com/songgj/p/8965580.html

去除git 多余的merge信息

git stash的妙用:去除git 多余的merge信息_如何隐藏git log中的所有merge记录-CSDN博客

产生的原因

原因在于git pull事实上相当于git fetch加上git merge操作。本地和远程分支都有不同的内容,触发了merge操作所以多了一个信息

解决方案

  1. 使用git pull --rebase
  2. 使用git rabase 自己的分支
    1. git rebase 分支处理 merge 的commit,提交日志列表里不会有merge的commit而是会有merge 的所有的commit。所以找出你要合并的区间,然后把中间的commit全部合并

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值