Git入门到精通

 一、环境搭建

1.Git的安装-官方网址:Git

2.快速上手:git 使用简易指南

3.Git小乌龟官网首页:Home · TortoiseSVN

4.Git插件小乌龟官网(英文页面):Downloads · TortoiseSVN

5.Git插件小乌龟官网(中文页面):下载 · TortoiseSVN

6.Git插件小乌龟汉化包下载:download.TortoiseGit.org – Index of /tgit/

二、Git常用命令

查看用户名:git config user.name
查看邮箱:git config user.email
查看密码:git config user.password 

设置信息
(1) --local: 本地设置(仅对当前仓库有效) 

git config --local user.name “你的名称”
git config --local user.email “你的邮箱”
git config --local user.password “xxxxx密码” 
git config --local--unset credential.helper 删除凭证存储配置
git config --local credential.helper store  开启凭证存储配置

(2) --global 全局设置(对当前用户的所有仓库有效,会在用户的主目录生成.gitconfig文件) 

git config --global user.name “你的名称”
git config --global user.email “你的邮箱”
git config --global user.password “xxxxx密码” 
git config --global --unset credential.helper 删除凭证存储配置
git config --global credential.helper store   开启凭证存储配置


没试过:
git config --system --unset credential.helper 删除凭证存储配置
git config --system credential.helper store   开启凭证存储配置

三、查看配置
使用 git config --list 查看已配置的git账户信息 
git config --list  
git config --system --list
git config --global --list
git config --local --list
git config --show-origin --get credential.helper 【查看 credential.helper 所在的文件目录(可能一个电脑上有多个.gitconfig文件)】

修改本地密码(此操作是克隆项目时账号密码错误使用,可以在克隆报错时自动提示键入密码)

gitconfig--system--unsetcredential.helper

设置记住密码(默认15分钟):

git config --global credential.helper cache

如果想自己设置时间,可以这样做:

git config credential.helper 'cache --timeout=3600'

这样就设置一个小时之后失效

长期存储密码:

git config --global credential.helper store
(当你再次pull或push时,还会弹出需要输入账号密码,输入完这一次,下次就不用再次输入了.)

增加远程地址的时候带上密码也是可以的。(推荐)

从仓库的config的里面修改url,后面加上密码

http://yourname:[email protected]/name/project.git

作者:偷影子的人baby
链接:https://www.jianshu.com/p/fecb7a990764
来源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

查看自带的版本
git --version

查看git配置的user和email
git config --global  --list 

全局配置
git config --global  user.name "这里换上你的用户名"
git config --global user.email "这里换上你的邮箱"

git config --global --unset user.name "username" #移除用户
git config --global --unset user.email "email"   #移除邮箱

如果你公司的项目是放在自建的gitlab上面, 如果你不进行配置用户名和邮箱的话, 则会使用全局的, 这个时候是错误的, 正确的做法是针对公司的项目, 在项目根目录下进行单独配置

git config user.name “your Name”
git config user.email “[email protected]”

在当前项目下面查看的配置是全局配置+当前项目的配置
使用的时候会优先使用当前项目的配置
git config --list


git相关的配置文件有三个

1. /etc/gitconfig:包含了适用于系统所有用户和所有项目的值。

2.~/.gitconfig:只适用于当前登录用户的配置。

3. 位于git项目目录中的.git/config:适用于特定git项目的配置。

对于同一配置项,三个配置文件的优先级是1<2<3

 git config [–system|–global|–local] -l

使用system, golbal, local时,分别列出对应一部分中的1,2,3三个文件之一的配置项。

如果不加上述三个选项,则会按一部分中所说的优先级合并所有配置项并输出。

git config [–local|–global|–system]  section.key value

例:

git config core.filemode true 

执行后会在配置文件中添加 

[core]
    filemode = true

3.删除配置项

git config [–local|–global|–system] –unset section.key

[alias] 为git命令配置别名

例:

[alias]
    st = status
    ci = commit
    br = branch 

当你有了上述配置后,使用git st等同于使用git stauts

[color] 设置git输出着色

例:

[color]
    ui = true

设置color.ui为true来打开所有的默认终端着色。

core.filemode 让git忽略对文件权限的修改

[core]
    filemode = false

7.生成秘钥

1.生成秘钥
ssh-keygen -t rsa -C "你的邮箱"    #生成密钥
ssh -T [email protected]                  #测试是否成功
2.生成指定名字的秘钥:
ssh-keygen -t rsa -C "你的邮箱" -f ~/.ssh/github_jslite
会生成 github_jslite 和 github_jslite.pub 这两个文件

秘钥复制到托管平台上(主要是.pub文件内容拷贝到托管平台)
vim ~/.ssh/github_jslite.pub
打开公钥文件 github_jslite.pub ,并把内容复制至代码托管平台上

ubuntu:
1 ctrl+alt+t         打开终端
2 ssh-keygen -t rsa -C "你的邮箱" -f ~/.ssh/filename
   会生成 filename 和 filename.pub 这两个文件
3 秘钥复制到托管平台上(主要是.pub文件内容拷贝到托管平台) 

执行命令后需要进行3次或4次确认:
1.确认秘钥的保存路径(如果不需要改路径则直接回车);
2.如果上一步置顶的保存路径下已经有秘钥文件,则需要确认是否覆盖(如果之前的秘钥不再需要则直接回车覆盖,如需要则手动拷贝到其他目录后再覆盖);
3.创建密码(如果不需要密码则直接回车);
4.确认密码;
5.C:\Users\Admin\.ssh目录下生成id_rsa和id_rsa.pub文件
6.打开你远程git仓库的配置页面-选择SSH and GPG keys-选择New SSH key
7.用文本工具打开之前生成的id_rsa.pub文件,把内容拷贝到key下面的输入框,并为这个key定义一个名称   

8.添加远程仓库地址

添加github
git remote add origin https://github.com/xxx(仓库地址) 


eg:
增加 3 个远程库地址
git remote add origin https://github.com/JSLite/JSLite.git
git remote set-url --add origin https://gitlab.com/wang/JSLite.js.git
git remote set-url --add origin https://oschina.net/wang/JSLite.js.git
删除其中一个 set-url 地址
usage: git remote set-url [--push]   []
   or: git remote set-url --add  
   or: git remote set-url --delete  
git remote set-url --delete origin https://oschina.net/wang/JSLite.js.git

 9.查看项目的当前状态

git status
git status -s

 10.查看最新的commit

git show

11.查看指定commit hashID的所有修改 

git show commitId

 12.查看某次commit中具体某个文件的修改

git show commitId fileName

13. Git提交命令

提交所有文件
git add .
git add *

提交指定位置的文件
git add src/main/java/com/config

提交备注
git commit -m "提交备注"


提交到github
git push origin master(分支名)
git push -u origin master(分支名)push 同时设置默认跟踪分支
git push -f origin master (强制推送到主分支,全写 --force)

提交到oschina
git push oschina master(分支名)

14.创建分支命令

创建新分支,分支名称为:dev
git branch dev

 15.删除远程分支

git push origin --delete new  #删除远程分支new
git branch -d branchName      #删除本地分支,强制删除用 - D

16.重命名分支

git branch -m old new # 重命名分支

Git入门到精通_第1张图片 

 

 17.切换分支命令

切换分支到dev
git checkout dev

18.快速创建分支并切换到该分支命令

 git checkout -b dev

19.拉取远程分支同时创建对应的本地分支

git checkout -b  origin/dev

(git checkout -b 本地分支名dev origin/远程分支名dev)

20.克隆指定分支

git clone -b 分支名 仓库地址

21.查看本地和远程分支

git branch -a

22.单独查看远程仓库的所有分支

git branch -r

23.将本地分支与远程分支保持同步

git fetch 

24.将本地所有分支与远程分支保持同步

git fetch --all

25.拉取所有分支的代码

git pull --all

26.本地与服务器端同步

git pull

27.查看远程库

git remote show

28.显示远程库origin里的资源

git remote show origin

29.从Git中删除指定文件

git rm read.txt

30.更新远程分支列表

git remote update origin --prune

31.删除远程分支dev

git push origin --delete dev

32.删除本地分支dev

git branch -d  dev

 33.取消 git add 操作

仅取消 git add 带来的效果,即本地的修改还在,但是取消了add 的状态。
git reset --mixed 

34.回退到指定到 commit号

git reset --hard commitId

 取消commit时,更安全的操作: revert

git revert commitId

举个栗子: 按序有三个commit: c1, c2, c3。 现在我们位于c3.

  • git commit --hard c2, 则当前状态会退回到 c2, 你用git log, 只会看到c1、c2.
  • git revert c2,则会新添加一个c4的commit, git log 可以看到 1 ~ 4 全部的commit。

如果你想撤销远端的代码呢

如果使用了revert,直接 git push 即可。
如果使用的是git reset,或者 rebase到了之前的commit; 在更改了本地代码以后,git push -f。-f 一定慎用,如果涉及到远端主分支,干脆就不要用。涉及远端的,还是推荐用 revert

35.查看log

git log                  #查看最近的提交日志

git log --pretty=oneline #单行显示提交日志,更简洁,不显示日期,但是按日期排序的。

git config format.pretty oneline # 显示历史记录时,每个提交的信息只显示一行

git log -num             #显示第几条 log(倒数)

git log --since=1.day    #一天内的提交;你可以给出各种时间格式,比如说具体的某一天

git config color.ui true # 彩色的 git 输出

git reflog               #查看所有分支的操作记录

git log --graph --pretty=oneline --abbrev-commit

        git log -n --pretty=oneline //倒着显示,最新的提交的n条log,以单行简洁方式显示

        git log --pretty=oneline -n //倒着显示,最新的提交的n条log,以单行简洁方式显示 

Git撤销&回滚操作 - 知乎

36.git回退到某个历史版本

git log 命令查看所有的历史版本,获取某个历史版本的id,假设查到历史版本的id是139dcfaa558e3276b30b6b2e5cbbb9c00bbdca96

回退 

git reset --hard 139dcfaa558e3276b30b6b2e5cbbb9c00bbdca96

把修改推到远程服务器

git push -f -u origin master

37. Git-回退到指定版本_JeffersonZHabc的专栏-CSDN博客_git 回退指定版本

  • 1. 方法一:git reset
  • 2.方法二:git commit --amend

1. 方法一:git reset

直接回退到指定版本,目标版本之后的提交将被删除。

1.1 情况一:git reset --hard 版本库地址” ,拉取服务器指定提交到暂存区,该操作不影响工作区。

1.1.1 步骤1:执行“git reset --hard 版本库地址” ,将服务器指定版本拉取到本地暂存区。
查看log,即可看到版本已经回退到目标版本。

 1.1.2 步骤2:“git checkout 文件名”,从暂存区拉取到工作区。

1.2 情况二:“git reset --hard HEAD^ ”:拉取服务器最近一次提交到暂存区,该操作不影响工作区。
然后执行“git checkout 文件名”,从暂存区拉取到工作区。

“ 注:如果未进行push操作,则可以直接执行“git checkout 文件名”, 拉取暂存区来替换工作区”。

2.方法二:git commit --amend

如果上次提交的内容有误,想进行修改,而且不想进行新的提交,使用git commit – amend。
步骤:
1.修正内容,执行“git add”;
2.执行“git commit --amend”;
3.自动进入vim提示需要添加commit信息。输入:“i”添加信息"delete fff",“esc”、“wq”退出并保存;
4.执行“git push -f”成功推送到服务器 (git push会提示报错:当前暂存区版本低于服务器版本一次提交)。

注:amend提交信息会附加在最新提交信息之下。

38.git add 如果添加了错误的文件的话

撤销操作
git status 先看一下add 中的文件 
git reset HEAD 如果后面什么都不跟的话 就是上一次add 里面的全部撤销了 
git reset HEAD XXX/XXX/XXX.java 就是对某个文件进行撤销了

39.git 放弃本地修改,用远程分支来覆盖本地分支的内容

  1. git status                             //查看本地改动过的文件 
  2. git fetch --all                       //意思是从另一个存储库中下载对象和参考
  3. git reset --hard origin/dev   // dev是远程分支的名称
  4. git pull                                //更新分支
  5. git status                            //查看一下

40.git 撤销本地commit 

git reset [ --mixed | --soft | --hard] []
1.使用参数--mixed(默认参数),如git reset --mixed  或 git reset   
        撤销git commit,撤销git add,保留编辑器改动代码
2.使用参数--soft,如git reset --soft
        撤销git commit,不撤销git add,保留编辑器改动代码
3.使用参数--hard,如git reset --hard ——此方式非常暴力,全部撤销,慎用
        撤销git commit,撤销git add,删除编辑器改动代码

情境1:

有的时候你只需要撤销commit,但并不想将commit下的代码也撤销,那么可以先找到你的最新的commit号
git log

撤销上一次的commit:git reset HEAD~  或   git reset HEAD~1
撤销前n次的commit : git reset HEAD~3
注:使用此命令,你原来提交的代码都在,不会被撤销 

情境2:

如果你使用了多次git commit命令,但是发现刚刚commit的内容不需要提交了,需要恢复到上一次的commit时,使用如下命令:
git reset --hard HEAD^1
注:使用了之后,你最新的commit命令下修改的内容将完全被撤销。

开始撤销commit的示例:

git log 
git log --pretty=oneline // 提交的所有  按下键盘上的字母q可以退出查看git的日志
git log --pretty=oneline -n// 最近n此提交的  

Git必须知道当前版本是哪个版本,在Git中,用HEAD表示当前版本,也就是最新的提交commit id,上一个版本就是HEAD^(或者HEAD~1),上上一个版本就是HEAD^^(或者HEAD~2),同理往上N个版本写N个^不太现实,我们写成HEAD~100。

现在,我们要把当前版本test3上一个版本test2,就可以使用git reset命令:git reset --hard HEAD^,再查看日志,发现已经剩下2个commit版本了

git reset --hard HEAD^
git reset --hard ab7b //版本号可以不用写全,输入前4位或更多也是可以,Git会自动去找,不能只写前一两位,因为Git可能会找到多个版本号。

最后在Git中,总是有后悔药可以吃的,Git提供了一个命令git reflog用来记录你的每一次命令,通过它可以查到每个commit id,方便你前进或者回退到指定的版本

41. git clone 所有分支

git clone 默认是克隆Head指向的master分支,如果是多分支,我们可以单个克隆分支项目。

1.只克隆单分支(非master):

 git clone -b 分支名 https://xxx.git

2.克隆所有分支(多分支)

         cd project  //切换到指定目录
         git clone https://xxx.git //克隆项目(默认master分支)

         cd xxx  //切换到项目目录
         git branch -a  //列出所有分支名称如下: * 号表示当前分支
          * master  
          remotes/origin/HEAD -> origin/master
          remotes/origin/desktop
          remotes/origin/dev
          remotes/origin/template

由上结果可以看出,远程仓库origin还有desktop、dev、template等分支。接下来,可以在本地新建分支并与远程仓库的分支进行关联了。

      作用是checkout远程仓库origin的分支template,在本地起名为template分支,并切换到本地的template分支 

         git checkout -b template origin/template
         git checkout -b dev origin/dev    // 作用参见上一步解释


通常情况下,我们使用命令 git clone 来下载代码。但是下载的代码一般都是默认分支(默认分支可以再gitlab/github里设置)。

# 克隆代码,仅下载一个分支,gitlab/github上设置的默认分支,一般是master/main。也可以指定分支clone
git clone https://github.com/pcottle/learnGitBranching.git
此时。

# 显示本地分支(注意:是本地分支),分支前面有 * 号的表示处于当前分支
git branch
# 显示所有分支,包括远程分支。
git branch -a
在有网的情况下。我们clone代码之后,切换分支时比较容易的,通过。

git checkout 分支名
即可切换分支。但是如果说目前并不知道要用到哪些分支。而且我需要把代码传输到内网环境下使用,那就只能 挨个去checkout 所有分支,然后就进行内网传输。

这就带来一个问题,如果代码分支数量少还好说,如果分支比较多,就比较麻烦了。有什么简单的方法可以一次下载所有分支么?

通过我们在做Git迁移时,需要使用到一个命令。

git clone --bare https://github.com/pcottle/learnGitBranching
即 git clone --bare (需要注意这种方法下载的文件是不能直接使用的)。 关于git迁移,可以查阅

那么现在我们也可以通过使用这种方式来进行全量分支的下载。

# 创建一个空文件夹
mkdir repo
# 进入该文件夹
cd repo
# 使用bare方式clone代码。并把下载后的文件夹重命名为 .git
git clone --bare path/to/repo.git .git
# 使用该命令(不用担心core.bare是否存在) 或 git config --bool core.bare false
git config --unset core.bare
# 使用该命令
git reset --hard
之后你就可以通过

git branch
命令查看本地所有分支。你会发现本地有所有的分支。

这里有几点需要注意:

1.是使用bare的形式去下载

2.下载完后重命名文件夹

3.将重命名后的文件夹,放到一个空文件中(这一步不是必须的,但是有必要,因为如果不这么做并且所在文件夹的文件数量有很多的的话,后续的两个命令恢复的代码,会搞的比较乱)

目前来说这种方式是最好的下载git所有分支的办法了。网上的其他方法并不好用。
————————————————
版权声明:本文为CSDN博主「kanyun123」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/kanyun123/article/details/116749871

三、《一、git 创建分支 并 提交到远程分支》

查看远端库的分支情况
git branch -r

从已有的分支创建新的分支(如从master分支),创建一个dev分支
git checkout -b dev

创建完可以查看一下,分支已经切换到dev
git branch -a

建立本地到上游(远端)仓的链接 --这样代码才能提交上去
git branch --set-upstream-to=origin/dev 

将本地 dev 分支与远程 dev 分支之间建立链接
git branch --set-upstream dev origin/dev

手动建立追踪关系
git branch --set-upstream master origin/next 

取消对master的跟踪
git branch --unset-upstream master


现在随便修改一下工程文件的内容,然后git commit ,git push,之后就可以直接提交到远程的dev分支中,而不会是master

参考链接:https://my.oschina.net/u/219482/blog/285584
以下两个应该是同一个意思,=upstream : 上游码流的意思
git branch --set-upstream-to=master
git branch --set-upstream-to=original/master


git help branch
git branch [--set-upstream | --track | --no-track] [-l] [-f]  []
git branch (--set-upstream-to= | -u ) []
git branch --unset-upstream []

git branch --set-upstream-to=original/master new
git branch --set-upstream debug origin/debug //其中debug为创建的分支

提交该分支到远程仓库
git push origin dev  

四、《二、  git push origin 与 git push  -u origin master的区别》

$ git push origin

上面命令表示,将当前分支推送到origin主机的对应分支。 

如果当前分支只有一个追踪分支,那么主机名都可以省略。 

$ git push 如果当前分支与多个主机存在追踪关系,那么这个时候-u选项会指定一个默认主机,这样后面就可以不加任何参数使用git push。

$ git push -u origin master 上面命令将本地的master分支推送到origin主机,同时指定origin为默认主机,后面就可以不加任何参数使用git push了。

# 本地分支代码提交到远端库
git push origin master
git push origin HEAD:refs/for/远端分支名

git push origin 本地分支名:refs/for/远端分支名

eg:
git push origin test:refs/for/master #本地test分支代码提交到远端master库

五、《三、在远端服务器新建分支》


方法1:

git checkout -b dev
#建立本地到上游(远端)仓的链接 --这样代码才能提交上去
git branch --set-upstream-to=origin/dev
git branch --set-upstream debug origin/debug //其中debug为创建的分支
git push origin dev

#取消对master的跟踪
git branch --unset-upstream master

 

方法2:

git branch -b stage2
git push origin 本地分支名:远端分支名xx  // 在服務器新建新分支名xxx

 

对比:

git branch -b stag2
git push origin stage2:refs/for/stage2 // 代码入庫命令,不会新建新分支在远端
    
    
https://www.cnblogs.com/bluestorm/p/6252900.html

六、《删除分支》

• 删除一个已被终止的分支

如果需要删除的分支不是当前正在打开的分支,使用branch -d直接删除
git branch --delete dev来执行.有时还会通过缩写git branch -d dev来代替
-d是--delete的缩写,在使用--delete删除分支时,该分支必须完全和它的上游分支merge完成(了解上游分支,可以点击查看链接),如果没有上游分支,必须要和HEAD完全merge
git branch -d 
• 删除一个正打开的分支

如果我们在试图删除一个分支时自己还没转移到另外的分支上,Git就会给出一个警告,并拒绝该删除操作。

如果坚持要删除该分支的话,就需要在命令中使用-D选项。

-D是--delete --force的缩写,这样写可以在不检查merge状态的情况下删除分支
--force简写-f,作用是将当前branch重置到初始点(startpoint),如果不使用--force的话,git分支无法修改一个已经存在的分支.
    
git branch -D 
    
• 恢复被删除的分支

Git会自行负责分支的管理,所以当我们删除一个分支时,Git只是删除了指向相关提交的指针,但该提交对象依然会留在版本库中。

因此,如果我们知道删除分支时的散列值,就可以将某个删除的分支恢复过来。在已知提交的散列值的情况下恢复某个分支:

git branch  
如果我们不知道想要恢复的分支的散列值,可以用reflog命令将它找出来。如:
reflog命令:

显示整个本地仓储的commit,包括所有branch的commit,甚至包括已经撤销的commit。

只要HEAD发生了变化, 就会在reflog里面看得到。

这时恢复分支a_branch分支如下:

git branch  HEAD@{4}

总结:
git branch -d dev//删除本地分支
git branch -D dev//删除本地分支
git push origin --delete branch//删除远程分支同时会删除追踪分支
git branch --delete --remotes ///可以删除追踪分支,该操作并没有真正删除远程分支,而是删除的本地分支和远程分支的关联关系,即追踪分支
    
https://www.cnblogs.com/utank/p/7880441.html
https://www.jianshu.com/p/5068997164cb

七、Git使用过程中遇到的问题

1.Git克隆代码需要输入密码?Git提交代码需要输入账号、密码的。

tips:     1.Access denied.
       2.Authentication failed.
       3.Permission denied (publickey).
说明:问题根源是TortoiseGit采用的是自己的ssh.exe生成密钥,与git的密钥生成方式不一致,导致密钥无效。
解决:   1.重新配置用户名和邮箱,重新生成密钥,把密钥放入远程仓库中。
      2.检查TortoiseGit右键的TortoiseGit -> Settings -> Network设置,将SSH client指向 ~Git\usr\bin\ssh.exe

2.Git采用 http 方式(而不是ssh)clone/pull/push代码时,需要输入用户名密码,解决每次输入账号密码

解决:执行存储密码命令
  $git config --global credential.helper store
  命令会在项目本地生成一个文本,记录账号和密码。使用上述的命令配置好之后,再操作一次git pull,然后它会提示输入账号和密码,这一次之后就不需要再次输入账号和密码了。

八、《Idea中.gitignore》

Git在同步代码时,设置本地忽略文件的前提是,必须保证Git的远程端仓库中没有这个要忽略的文件。当远端包含有该文件时,本地设置的ignore将不再发挥作用。

解决方法:

    在本地的.gitignore文件里面添加上.idea/workspace.xml文件。

    如果已经将本地的文件提交到了远端,那么需要将远端提交的文件给删掉,删除指令为:

git rm -r --cached .idea                 删除远端的.idea及以下的所有文件
git rm -r --cached .idea/workspace.xml   单独删除远端的.idea/workspace.xml
git rm -r --cached .                     清空所有的git缓存

可以使用git status指令来查看删掉的文件,基本上都是***.xml文件。

九、 git 某个项目使用指定用户名密码

git每次需要输入用户名密码

某个项目使用git上传时其用户名密码与全局的用户名密码不同,这个时候只需修改项目文件夹下的.git文件夹下的config文件,添加

[credential]
	helper = 

直接等于空就可以,再次push、pull代码时,输入用户名和密码,此时不会影响全局的用户名密码,不过,添加了该项之后,这个项目每次都需要重新输入用户名和密码。

git设置如何设置自己的用户名密码

这里主要是配置一个config项
有两个方法,基本上原理都是一样,都是修改.git/config文件

1.使用如下命令,修改config文件即可保存

echo "[credential]" >> .git/config
echo "    helper = store" >> .git/config

2.直接修改.git/config文件

在linux/mac下可以直接使用vim工具修改config文件

ubuntu@VM-7-212-ubuntu:~/kernel-code/kernel-netfilter-sample-code$ vim .git/config

修改成如下:

[core]
    repositoryformatversion = 0
    filemode = true
    bare = false
    logallrefupdates = true
[remote "origin"]
    url = https://github.com/Miss-you/kernel-netfilter-sample-code.git
    fetch = +refs/heads/*:refs/remotes/origin/*
[branch "master"]
    remote = origin
    merge = refs/heads/master
##主要是后面这两行,如果不想保存,则删除即可
[credential]
    helper = store
##保存

这样就可以保存用户名密码,不用每次都输入了!

git config查看配置

使用git config --list查看已设配置

解决git push时每次需要输入用户名和密码方法

在git push时每次都要输入用户名和密码是一件很痛苦的事,其实解决方法很简单步骤如下:

  1. 在项目文件夹(包含隐藏文件夹.git文件夹的)内右键 git bash here
  2. 在git bash交互环境输入命令
    git config  credential.helper store
    git config --global credential.helper store

    这里没有–global意思是指只对这个仓库生效,建议以后都不要加–global,让代码配置以仓库为单位存储就好,设置成全局不灵活

  3. 打开.git文件夹内的config文件,会发现多了两行
    在这里插入图片描述

  4. git push 到远程仓库,按提示输入用户名和密码,注意要输入正确的(GitHub的用户名和密码) 

  5. 再次运行git push 就不用输入用户名和密码了,因为在用户主目录文件夹多了一个文件git-credentials,这个就是用来存储用户名和密码的
  6. 若想把项目的用户名和密码删掉,输入下列命令
    git credential-manager uninstall
    这样每次git push时又需要输入用户名和密码了。
     .git-credentials会记录账号和密码信息https://{username}:{password}@github.com

十、Git基础教程(必学) 

原文链接:Git基础教程(必学)-公众号 颜海镜

以下文章来源于颜海镜 ,作者颜海镜 

基础

学习命令行工具要学会的第一步就是查看帮助文档,可以用下面的命令查看 git 的帮助信息

git help
git help xxx
git xxx --help
git xxx -h

接下来就是一些自定义信息了,比如配置用户名和快捷命令(别名)

git config --global user.name yanhaijing
git config --global user.email [email protected]

git config --global alias.st status #git st
git config --global alias.co checkout #git co
git config --global alias.br branch #git br
git config --global alias.ci commit #git ci

值得一提的就是配置换行符了,windows 上的换行符和 mac 和类 unix 不一样,在跨平台时就痛苦了,为了统一,可以将提交到仓库的换行符同配置成 unix 格式

  git config --global core.autocrlf input

如果想把 git 仓库提交到服务器,可能还要配置秘钥,如果你不想每次都输入密码的话

ssh-keygen -t rsa -C [email protected] # 生成秘钥

cat ~/.ssh/id_rsa.pub # 获取公钥,配置到github 的sshkey

ssh -T [email protected] # 测试是否生效

玩转 git 的第一步,你需要有一个仓库,获取仓库总共有两种办法

git init # 初始化一个仓库
git clone url # 克隆一个已有仓库

有时候我们不想把某些文件提交到仓库里,比如编译产生的临时文件,此时.gitignore 能够发挥作用,.gitignore 的规则如下

  • • # 代表注释

  • • 每行是一个 path,glob 模式匹配

  • • !代表取非

  • • *代表 0 个或多个字符

  • • ?代表一个字符

  • • []代表集合

.gitattributes 这个还没想好怎么讲,挖个坑坑坑坑

git 仓库的工作流如下

Git入门到精通_第2张图片

git 的文件状态如下

Git入门到精通_第3张图片

image.png

想查看当前的仓库状态可以使用git status,这个命令能够给出很多提示信息,建议经常使用

关于 commit 的提交,每个 commit 必须是独立,完整的功能,保持适当粒度,不要过大也不要过小;关于提交信息的描述可以参考下开源届的规范,也可以看下我之前整理的提交规范[2],下面是一个提交的例子

Header = type: subject(feat fix style refactor)
Body = list

feat: 添加分享功能

给每篇博文添加分享功能Œ

- 添加分享到微博
- 添加分享到微信

在 git 内部一个 commit 的信息如下

Git入门到精通_第4张图片

image.png

但后面我们会进行如下的抽象

Git入门到精通_第5张图片

image.png

分支

git 中的分支非常轻量,就是对 commit 的一个引用,默认 git 会新建一个 master 分支,git 中有一个特殊的引用讲座 HEAD,他只想当前所在的位置

Git入门到精通_第6张图片

image.png

有时我们需要新建或删除分支

git branch test # 新建分支test
git branch –d test # 删除test分支,当前HEAD必须不能指向test分支

Git入门到精通_第7张图片

image.png

建好分之后,就该切换到那个分支去了

git checkout test # 切换到test分支

新建并切换分支,可以合并成一个命令,下面的命令等同于上面两条命令

git checkout –b test

Git入门到精通_第8张图片

image.png

在新建的分支上开发一段时间后,你可能需要将其合并到另一个分支去,而合并分支共有 4 种不同的方法,关于这四种方法的区别和场景请看这篇文章《图解 4 种 git 合并分支方法》。

远端

一张图概括远端和本地的关系,以及相应的操作命令

Git入门到精通_第9张图片

 image.png

其实 git 在远端是一个完整的仓库,和本地其实一样,也有 HEAD,也有 master;但我们本地为了防止冲突,都将远端的引用名字放到了 origin 下(origin 也可是别的名字)

Remote HEAD -> xxx/HEAD(origin/HEAD)
Remote master -> xxx/master(origin/master)

在.git 下面的 config 文件里面又对应规则的配置信息,fetch 哪一行,设置将远端refs/heads下的放到本地的refs/remotes/origin

[remote "origin"]
      url = [email protected]:yanhaijing/yanhaijing.github.io.git
      fetch = +refs/heads/*:refs/remotes/origin/*

对于远端最常用的操作就是更新和推送

git fetch origin # 将本地的远端和远端进行同步
git merge origin/master # 将本地的远端合并到本地分支

git pull origin # 这相当于上面两条命令

git push origin master # 将本地推送到远程分支

关于 push 的必须得说一下引用展开,下面这些命令是一样的,git 内部都会自动展开成最后一条

git push origin master
git push origin master:master
git push origin heads/master:heads/master
git push origin refs/heads/master:refs/heads/master

有时候我们可能会查看远端的信息,比如看下远端地址啥的

git remote –v # 查看全部远端的摘要信息
git remote show xxx # 查看具体远端的详细信息

有时候我们也会增加或删除远端

git remote add xxx url # 新加一个新的远端
git remote remove xxx # 删除一个远端

日志

有时我们需要查看 git 的提交日志,可以使用git log,log 有大量参数,感兴趣的同学可以自行探索,但常用的就下面这么几个

git log -number # 显示最近几条
git log --oneline(--abbrev-commit --pretty=oneline)# 单行显示,显示简短commit id
git log --graph # 以树形展示
git log --decorate # 显示分支名等
git log --first-parent # 显示第一父元素(不显示merge进来的树形结构)
git log --all # 显示全部分支

除了git log我们还可以使用 gitk 这个工具,这是 git 2.0 以后加入的图形化工具,可以以更友好等方式查看 log 树,常用的有两个参数

gitk –all # 显示全部分支
gitk --first-parent # 显示第一父元素(不显示merge进来的树形结构)

下图是git log和 gitk 的命令复杂度和显示效果

Git入门到精通_第10张图片

image.png

image.png

注:如果你在 mac 下使用 gitk,可能会发现显示非常模糊,这是因为 retina 屏幕的问题,可以尝试下下面的方法

首先安装 retinizer,如果你没安装 brew 可能需要安装 homebrew

$ brew cask install retinizer

然后打开 gitk 所在的目录

$ open /System/Library/Frameworks/Tk.framework/Versions/Current/Resources/

打开 retinizer,并将 Wish.app 拖拽到 retiniaer 的界面,然后点一下那个按钮,然后就 ok 了

下面是带不带--first-parent的区别

image.png

有人用 git 的 commit 只做了台北的公交线路图,我表示给跪了,感兴趣猛戳这里[3]

diff

diff 命令常用的命令有两个

git diff file #查看指定文件的差异
git diff --stat #查看简单的diff结果

下图总结了 diff 全部情况

image.png

常用命令总结

config
help status log
clone init
add commit
branch checkout diff
merge rebase
fetch pull push remote

---------------------------------------------------------------------------------------------

查看当前配置的用户信息:
git config user.name   // 获取当前登录的用户
git config user.email  // 获取当前登录用户的邮箱   
----------------------------------------------------------------------------------------------

    1:  git clone 克隆代码的地址
    2:git remote 查看所有远程仓库的
    3:git remote -v 查看远程厂库地址
    4:git remote rm origin  删除原先的远程仓库后-------准备再添加新的远程仓库
    5:git init
    6:git add -A
    7:  git commit -m '备注'
    8:  git  status 查看提交状态
    9:git  remote add origin  新地址
-------------------------------------------------------------------------------------------------
    1:  git clone 克隆代码的地址
    2:git remote 查看所有远程仓库的
    3:git remote -v 查看远程厂库地址
    4:   git remote add myOrigin 新地址
    5:git config --list
    6:   git push myOrigin master

git修改分支名称

1、修改本地分支名称
git branch -m oldBranchName newBranchName

2、将本地分支的远程分支删除
git push origin :oldBranchName

3、将改名后的本地分支推送到远程,并将本地分支与之关联
git push --set-upstream origin newBranchName


Git修改分支名称_Godiscj的博客-CSDN博客_git修改分支名称
Git修改分支名称_张俊杰1994的博客-CSDN博客_git改名

1、本地分支重命名

本地分支是指:你当前这个分支还没有推送到远程的情况,这种情况修改分支名称就要方便很多:

        git branch -m 原始名称 新名称

2、远程分支重命名

远程分支是指:假设你当前已经将该分支推送到远程了,这种情况修改起来要稍微多几步

1.先重命名本地分支

        git branch -m 旧分支名称  新分支名称
2.删除远程分支

        git push --delete origin 旧分支名称
3.上传新修改名称的本地分支

        git push origin 新分支名称
4.修改后的本地分支关联远程分支

        git branch --set-upstream-to origin/新分支名称
————————————————
版权声明:本文为CSDN博主「前端-卡布达」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/fsfsdgsdg/article/details/124000076

There are a few ways to accomplish that: 有几种方法可以做到这一点:

  1. Change your local branch and then push your changes 更改您的本地分支,然后进行更改
  2. Push the branch to remote with the new name while keeping the original name locally 用新名称将分支推送到远程,同时在本地保留原始名称

Renaming local and remote 重命名本地和远程

# Rename the local branch to the new name
git branch -m  
 
# Delete the old branch on remote - where  is, for example, origin
git push  --delete 
 
# Or shorter way to delete remote branch [:]
git push  :
 
# Push the new branch to remote
git push  
 
# Reset the upstream branch for the new_name local branch
git push  -u 

Renaming Only remote branch 重命名仅远程分支
Credit: ptim 信用: ptim

# In this option, we will push the branch to the remote with the new name
# While keeping the local name as is
git push  /:refs/heads/ :

Important note: 重要的提示:

When you use the git branch -m (move), Git is also updating your tracking branch with the new name. 当您使用git branch -m (移动)时,Git还将使用新名称更新您的跟踪分支。

git remote rename legacy legacy

git remote rename is trying to update your remote section in your configuration file. git remote rename正在尝试更新配置文件中的remote部分。 It will rename the remote with the given name to the new name, but in your case, it did not find any, so the renaming failed. 它将使用给定名称的遥控器重命名为新名称,但是在您的情况下,它找不到任何名称,因此重命名失败。

But it will not do what you think; 但这不会按照您的想法进行。 it will rename your local configuration remote name and not the remote branch. 它将重命名您的本地配置远程名称,而不是远程分支。


It seems that there is a direct way: 似乎有直接方法:

If you really just want to rename branches remotely (without renaming any local branches at the same time) you can do this with a single command like 如果您确实只想远程重命名分支(而不同时重命名任何本地分支),则可以使用单个命令执行此操作,例如

git push /:refs/heads/ :

Renaming branches remotely in Git 在Git中远程重命名分支

See the original answer for more detail. 有关更多详细信息,请参见原始答案。


If you have named a branch incorrectly AND pushed this to the remote repository follow these steps to rename that branch ( based on this article ): 如果您错误地命名了一个分支并将其推送到远程存储库,请按照以下步骤重命名该分支( 基于本文 ):

  1. Rename your local branch: 重命名您的本地分支:

    • If you are on the branch you want to rename: 如果您在分支上,则要重命名:
      git branch -m new-name

    • If you are on a different branch: 如果您在另一个分支上:
      git branch -m old-name new-name

  2. Delete the old-name remote branch and push the new-name local branch : 删除old-name远程分支,然后推送new-name本地分支 :
    git push origin :old-name new-name

  3. Reset the upstream branch for the new-name local branch : 为新名称的本地分支重置上游分支 :
    Switch to the branch and then: 切换到分支,然后:
    git push origin -u new-name


There is no direct method, 没有直接的方法,

  1. Rename Local Branch , 重命名本地分支 ,

    My current branch is master 我目前的分行是master

    git branch -m master_renamed #master_renamed is new name of master git branch -m master_renamed #master_renamed是master的新名称

  2. Delete remote branch, 删除远程分支,

    git push origin --delete master #origin is remote_name git push origin --delete master origin-删除 git push origin --delete master 服务器#origin是remote_name

  3. Push renamed branch into remote, 将重命名的分支推送到远程,

    git push origin master_renamed

That's it... 而已...


It can also be done the following way. 也可以通过以下方式完成。

At first rename local branch, then remote branch. 首先,重命名本地分支,然后重命名远程分支。

Renaming the local branch: 重命名本地分支:

If logged in another branch, 如果登录另一个分支,

git branch -m old_branch new_branch 

If logged in the same branch, 如果登录到同一分支,

git branch -m new_branch

Renaming remote branch: 重命名远程分支:

  1. git push origin :old_branch // Delete the remote branch

  2. git push --set-upstream origin new_branch // Create a new remote branch

如何重命名Git本地和远程分支名称?_CHCH998的博客-CSDN博客

远程仓库的移除与重命名 

git remote rename 修改一个远程仓库的简写名
git remote rename 老的名字 新的名字

说明:git remote rename这同样也会修改你的远程分支名字。
想要移除一个远程仓库。已经从服务器上搬走了或不再想使用某一个特定的镜像了,又或者某一个贡献者不再贡献了。可以使用git remote rm 仓库的别名 。

Git入门到精通_第11张图片

 

 

问题:git : 无法将“git”项识别为 cmdlet、函数、脚本文件或可运行程序的名称。请检查

添加git的bin目录的路径的环境变量,然后重启编辑器  即可

问题:win10环境下webstrom的终端git commit时候 git提示error: cannot run .git/hooks/pre-commit: No such file or directory

打开webstorm的setting看看git相关的配置,结果发现webstrom编辑器提示版本太低要求升级版本,原来是版本太低的原因造成的。

为什么往Github push提交不用输密码?

背景

今早我一如既往的往着自己的Github仓库提交代码,在命令行中熟练地输入:

git push

很快我的本地提交就被同步到Github上了,忽然我感到一个严肃的问题:

为什么我提交代码不用输我的帐号密码?难道我的Repo任何人都可以随意push代码吗?

不寒而栗,于是我开始搜索github push 权限

历程

  • 最开始找到的是如何在Github多人开发并管理权限的问题,例如:
     
  • Github 分配权限多人开发 三种方式
  • GitHub 实现多人协同提交代码并且权限分组管理
  • 但我并不是需要多人开发啊,这就是我自己的项目啊。再继续看搜索结果,而大多都是没有配置SSH、没有添加远程地址等内容,但似乎都不能解决我的问题

    还有说和全局配置有关的,然而我修改了git config --global一样还是可以提交代码,只是在github上的commit用户名和头像变了

  • 最终被一篇文章启发:git push的时候没有权限,简单来说就是git会缓存你的用户名密码,之后再进行操作时就免去了输入密码的过程

总结
其实原因就是git会缓存你的账号密码,当第一次使用git操作(例如:git clone)时肯定会让你输入帐号密码,之后git会记录这个凭证(crendential),至此以后凡是需要输入git密码的,都由这个凭证来自动填充了

后面我试过新建一个github帐号开一个新的repo,clone下来后就不能push了,会报403。这种就是权限问题了

查看凭证

项目目录git config --list | grep credential就可以看到凭证的缓存策略了,通常会有store(硬盘)、*cache(缓存)*等,但在我的windows系统下得到的是

credential.helper=manager

这其实是Windows自带的凭据管理工具,可以参考介紹好用工具:Git Credential Manager for Windows (記憶 Git 常用密碼)和Git 本地保存账号密码的删除或修改

凭据管理器

 如果把对应凭据删掉再去push的话,就会要求你输入账号密码了

解决git提交每次都要输入密码

Git入门到精通_第12张图片

 解决git提交每次都要输入密码Git入门到精通_第13张图片

Git - 凭证存储

Git入门到精通_第14张图片

 Git入门到精通_第15张图片

总结

欢迎大家阅读本文,如果你觉得本文对你有帮助,那就点赞加关注作者吧,如果对本文有任何疑问,欢迎在评论区交流。

引用链接

[1] 这里: https://git-scm.com/downloads
[2] 提交规范: http://yanhaijing.com/git/2016/02/17/my-commit-message/
[3] 猛戳这里: http://gugod.org/2009/12/git-graphing/

你可能感兴趣的:(git)