【115】git 常用命令和报错

内容目录

一、git 基本命令二、多github帐号的SSH key切换三、fatal: refusing to merge unrelated histories四、fatal: Could not read from remote repositort五、.gitignore六、you need to resolve your current index first 

git下载链接:https://pan.baidu.com/s/1lWc9Wb9J3I68sTCEx8gCWQ

提取码:1jub

一、基本命令

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

           git主要操作包括以下几部分:工作区(本地文件夹) ===> 暂存区(stage状态) ===> 本地版本库(本地git仓库) ===> 远程版本库(github远程仓库)

1、git安装完成后的用户配置
git config --global user.name "name"
git config --global user.mail "email"

2、本地git操作
git init   # 初始化本地git仓库,新增的.git文件用于管理版本

git add   #  把提交的修改放到暂存区;commit吧暂存区的修改提交到分支  

git add   #  添加到提交队列
git commit -m "new modify"  // 提交并且添加备注
git status  #  modified 红色说明本地已提交队列中的文件有更新;绿色表示更新已经添加到队列  
git diff  #  查看提交的更新 
git log   #  查看历史记录
git log --pretty=oneline  #  单行输出历史记录
git reset --hard HEAD^   #  回退到上一版本
git reset --hard "commit-id"  #  回退到指定版本
git reflog                #  查看更多历史记录,
git checkout -- "delete add"  #  把错误add的文件从暂存区删除;用于回退add操作,也可以回退未add的文件;使用版本库替换工作区版本

git rm filename #  从git版本库中删除文件;然后commit即可更新本地版本库;如果是本地删除,还可以用checkout把文件从版本库中恢复回来


3、远程git操作
#  链接远程仓库(github仓库)
$ ssh-keygen -t rsa -C "youremail@example.com"  #  在~目录(根目录)下生成本机的ssh秘钥、公钥,是github能够接受本机的提交   

#  向本地版本库关联远程库的地址
#  在本地仓库下运行
$ git remote add origin git@github.com:username/resposityName.git  

4、github push出错小结
'''
failed to push some refs to 'https://github.com/foodporn/ddd.git'
Updates were rejected because the tip of your current branch is behind
its remote counterpart. Integrate the remote changes (e.g.
'git pull ...') before pushing again.

出错原因: 
远程仓库内有一个README.md 与本地的仓库不一致
解决方法: 
git pull --rebase origin master 把远程仓库中的README.md同步到本地版本库;以后在github网页创建远程仓库,不要init README.md文件......

'''
git push -u origin master 
# 使用命令git push -u origin master第一次推送master分支的所有内容;
# 此后,每次本地提交后,只要有必要,就可以使用命令git push origin master推送最新修改;

git remote show   # 查看所有远程分支

5、分支branch原理:
'''
初始指针链:HEAD ==> master ==> 主线
新增new Branch后: 指针 ==> 分支;master仍指向主线;
merge分支后;master==>dev,即把分支与主线合并;
分支常用于:完成一个新的阶段任务,等该阶段完全结束,再merge到master上,不会污染;
'''
git checkout -b dev  # 创建分支并且切换到该分支
#相当于$ git branch dev 与 $ git checkout dev的合并

git branch    #查看所有分支;标*为当前分支

git checkout master; git merge dev;   # 切换回主线,并且合并分支dev;

git branch -d dev   # 删除分支dev

6、仓库快照
#add之后还不能commit,但是需要移动到新的分支开始新任务
仓库快照
add之后还不能commit,但是需要移动到新的分支开始新任务

7、远程分支操作
# 在dev存在的情况下,他人clone项目后,想对dev分支做提交修改;
git clone 'url'  
git checkout -b dev origin/dev    #  第三方切换到dev分支进行开发  
git push origin dev               #  向dev分支提交 

git pull   #  同步到本地,对本地产生修改;
git clone  #  克隆一份到本地;

'''
所有的分支文件,都是在master的基础上扩展的  
拉取远程分支内容
$ git pull origin newUser:newUser
$ git pull origin remoteResposity:localResposity
从本地推送分支,如果推送失败,先用git pull抓取远程的新提交;
git push origin branch-name

在本地创建和远程分支对应的分支,使用git checkout -b branch-name origin/branch-name,
本地和远程分支的名称最好一致;

建立本地分支和远程分支的关联,使用git branch --set-upstream branch-name origin/branch-name;
'''

8、git 标签管理

git tag <tagname> # 用于新建一个标签,默认为HEAD,也可以指定一个commit id;

git tag -a <tagname> -m "this is memeo" # 可以指定标签信息;

git tag # 可以查看所有标签。
git checkout <tag_name> # 切换到指定标签

git log --pretty=oneline --abbrev-commit # 找到历史提交的commit id

git tag -d <tagname> # 删除标签

git push origin :refs/tags/<tagname> # 可以删除一个远程标签。

git show <tag_name> # 查看标签的详细信息(包含commit的信息)
git tag -ln [tag_name] #显示标签名及其描述信息

git push <remote_name> <tag_name>  # 将标签推送到远程服务器
git push <remote_name> --tags  # 将本地的全部tag推送到远程服务器

git tag -d <tag_name> # 删除本地的标签
git push <remote_name> :refs/tags/<tag_name> # 删除远程标签

1.1 简单的代码提交流程

  • git status 查看工作区代码相对于暂存区的差别

  • git add . 将当前目录下修改的所有代码从工作区添加到暂存区 . 代表当前目录

  • git commit -m ‘注释’ 将缓存区内容添加到本地仓库

  • git pull origin master先将远程仓库master中的信息同步到本地仓库master中

  • git push origin master 将本地版本库推送到远程服务器,

    origin是远程主机,master表示是远程服务器上的master分支和本地分支重名的简写,分支名是可以修改的

1.2 Git add

    git add [参数] <路径> 作用就是将我们需要提交的代码从工作区添加到暂存区,就是告诉git系统,我们要提交哪些文件,之后就可以使用git commit命令进行提交了。

 为了方便下面都用 . 来标识路径, . 表示当前目录,路径可以修改,下列操作的作用范围都在版本库之内。

  • git add .

    不加参数默认为将修改操作的文件和未跟踪新添加的文件添加到git系统的暂存区,注意不包括删除

  • git add -u .

    -u 表示将已跟踪文件中的修改和删除的文件添加到暂存区,不包括新增加的文件,注意这些被删除的文件被加入到暂存区再被提交并推送到服务器的版本库之后这个文件就会从git系统中消失了。

  • git add -A .

    -A 表示将所有的已跟踪的文件的修改与删除和新增的未跟踪的文件都添加到暂存区。

1.3 Git commit

        git commit 主要是将暂存区里的改动给提交到本地的版本库。每次使用git commit 命令我们都会在本地版本库生成一个40位的哈希值,这个哈希值也叫commit-id,

 commit-id 在版本回退的时候是非常有用的,它相当于一个快照,可以在未来的任何时候通过与git reset的组合命令回到这里.

  • git commit -m ‘message’

    -m 参数表示可以直接输入后面的“message”,如果不加 -m参数,那么是不能直接输入message的,而是会调用一个编辑器一般是vim来让你输入这个message,

message即是我们用来简要说明这次提交的语句。

  • git commit -am ‘message’ -am等同于-a -m

    -a参数可以将所有已跟踪文件中的执行修改或删除操作的文件都提交到本地仓库,即使它们没有经过git add添加到暂存区,

注意: 新加的文件(即没有被git系统管理的文件)是不能被提交到本地仓库的。

1.4 Git push

        在使用git commit命令将修改从暂存区提交到本地版本库后,只剩下最后一步将本地版本库的分支推送到远程服务器上对应的分支了,如果不清楚版本库的构成,可以查看我的另一篇,git 仓库的基本结构。

 git push的一般形式为 git push <远程主机名> <本地分支名> <远程分支名> ,例如 git push origin master:refs/for/master ,即是将本地的master分支推送到远程主机origin上的对应master分支, origin 是远程主机名。第一个master是本地分支名,第二个master是远程分支名。

  • git push origin master

    如果远程分支被省略,如上则表示将本地分支推送到与之存在追踪关系的远程分支(通常两者同名),如果该远程分支不存在,则会被新建

  • git push origin :refs/for/master

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

  • git push origin

如果当前分支与远程分支存在追踪关系,则本地分支和远程分支都可以省略,将当前分支推送到origin主机的对应分支

  • git push

    如果当前分支只有一个远程分支,那么主机名都可以省略,形如 git push,可以使用git branch -r ,查看远程的分支名

1.5 关于 refs/for:

        refs/for 的意义在于我们提交代码到服务器之后是需要经过code review 之后才能进行merge的,而refs/heads 不需要

1.6 pull

        git pull 命令基本上就是 git fetch 和 git merge 命令的组合体,Git 从指定的远程仓库中抓取内容,然后马上尝试将其合并进你所在的分支中。

        从远程仓库中获得数据,可以执行:

$ git fetch [remote-name]

        这个命令会访问远程仓库,从中拉取所有你还没有的数据。执行完成后,你将会拥有那个远程仓库中所有分支的引用,可以随时合并或查看。

        但是注意的是 git fetch 并不会自动合并或修改你当前的工作。当准备好时你必须手动将其合并入你的工作。

        如果你使用 clone 命令克隆了一个仓库,命令会自动将其添加为远程仓库并默认以 “origin” 为简写。所以,git fetch origin 会抓取克隆(或上一次抓取)后新推送的所有工作。

        由于fetch命令后还要再做一步merge命令的操作,所以使用 git pull 命令来自动的抓取然后合并远程分支到当前分支。(相当于一次执行fetch加merge命令)这可能会是一个更简单或更舒服的工作流程。

1.7 推送分支

git push origin master
git push origin dev


1.8 git reset用法
'''
1.回退到上一版本:git reset –hard HEAD^
2.回退到上上版本:git reset –hard HEAD^^
3.回退到上100个版本:git reset –hard HEAD~100
4.回退到具体版本:git reset –hard 具体版本号(即每次提交生成的版本号写全或者只写前5,6个)
5.git reflog :该命令记录每一次命令
'''

二、多github帐号的SSH key切换  

        我有两个github帐号,一个是个人所用,一个是为公司项目所用。如果是单用户(single-user),很方便,默认拿id_rsa与你的github服务器的公钥对比;如果是多用户(multi-user)如user1,user2,那么就不能用在user2的身上了,这个时候就要配置一下了:

1、新建user2的SSH Key

#新建SSH key:
$ cd ~/.ssh     # 切换到C:\Users\Administrator\.ssh
ssh-keygen -t rsa -C "mywork@email.com"  # 新建工作的SSH key
# 设置名称为id_rsa_work
Enter file in which to save the key (/c/Users/Administrator/.ssh/id_rsa): id_rsa_work

2、新密钥添加到SSH agent中

        因为默认只读取id_rsa,为了让SSH识别新的私钥,需将其添加到SSH agent中:

ssh-add ~/.ssh/id_rsa_work

        如果出现Could not open a connection to your authentication agent的错误,就试着用以下命令: 

ssh-agent bash
ssh-add ~/.ssh/id_rsa_work

3、修改config文件
        在~/.ssh目录下找到config文件,如果没有就创建:

touch config        # 创建config

        配置config

# 该文件用于配置私钥对应的服务器
# Default github user(first@mail.com)
Host github.com
 HostName github.com
 User git
 IdentityFile C:/Users/Administrator/.ssh/id_rsa
 # second user(second@mail.com)
 # 建一个github别名,新建的帐号使用这个别名做克隆和更新
Host github2
 HostName github.com
 User git
 IdentityFile C:/Users/Administrator/.ssh/id_rsa_work

        如果存在的话,其实就是往这个config中添加一个Host:

#建一个github别名,新建的帐号使用这个别名做克隆和更新
Host github2
HostName github.com
User git
IdentityFile ~/.ssh/id_rsa2

        其规则就是:从上至下读取config的内容,在每个Host下寻找对应的私钥。这里将GitHub SSH仓库地址中的git@github.com替换成新建的Host别名如:github2,那么原地址是:git@github.com:username/repositories.git,替换后应该是:github2:username/repositories.git。

4、打开新生成的~/.ssh/id_rsa2.pub文件,将里面的内容添加到GitHub后台。

可不要忘了添加到你的另一个github帐号下的SSH Key中。

5、测试:

$ ssh -T git@github.com
Hi username! You've successfully authenticated, but GitHub does not provide shel
l access.

$ ssh -T github2
Hi username! You've successfully authenticated, but GitHub does not provide shell
 access.

三、fatal: refusing to merge unrelated histories

        出现这个问题的最主要原因还是在于本地仓库和远程仓库实际上是独立的两个仓库。假如我之前是直接clone的方式在本地建立起远程github仓库的克隆本地仓库就不会有这问题了。

        查阅了一下资料,发现可以在pull命令后紧接着使用--allow-unrelated-history选项来解决问题(该选项可以合并两个独立启动仓库的历史)。

$git pull origin master --allow-unrelated-histories

        以上是将远程仓库的文件拉取到本地仓库了。
        紧接着将本地仓库的提交推送到远程github仓库上,使用的命令是:

$ git push <远程主机名> <本地分支名>:<远程分支名>
也就是
$git push origin master:master
提交成功。

四、fatal:Could not read from remote repositort.

git clone项目失败,Host key verification failed.

在clone时不能直接按"回车"键过去,要手动输入"yes"才可以。

五、.gitignore    

        输入 touch .gitignore 在文件夹就生成了一个“.gitignore”文件。

然后用编辑器打开这个文件进行编辑就行了。

写规则来操作要忽略的文件了。

        值得注意的是,ignore文件针对当前以及以后的代码有效,如果之前已经上传的代码,现在ignore,不会成功。可以自己手动删除,使用-A。

        .gitignore文件过滤有两种模式,开放模式和保守模式:

开放模式:

过滤文件夹设置:/mtk/ 表示过滤这个文件夹

过滤文件设置: 指定过滤某种类型的文件,指定过滤某个文件

*.zip
*.rar
*.via
*.tmp
*.err

/mtk/do.c
/mtk/if.h



保守模式:负责设置哪些文件不被过滤,也就是哪些文件要被跟踪。

跟踪某个文件夹:!/plutommi/mmi

跟踪某类文件:

!*.c

!*.h

!/plutommi/mmi/mmi_features.h

六、you need to resolve your current index first 

    1、解决conflicts后再次执行merge;
    2、回退到merge前
    既然merge冲突是其他同事的文件,我不需要去resolve conflicts,那就退回merge前吧,单纯的改我的文件再push吧,执行以下代码:

 git reset --merge  
或者
git push --set-upstream origin 分支名



About Me:小麦粒

● 本文作者:小麦粒,专注于python、数据分析、数据挖掘、机器学习相关技术,也注重技术的运用

● 作者博客地址:https://blog.csdn.net/u010986753

● 本系列题目来源于作者的学习笔记,部分整理自网络,若有侵权或不当之处还请谅解

● 版权所有,欢迎分享本文,转载请保留出处

● 个人微信:pythonbao 联系我加微信群

● 个人QQ:87605025

● QQ交流群pythonbao :483766429

● 公众号:python宝 或 DB宝

● 提供OCP、OCM 和 高可用最实用的技能培训

● 题目解答若有不当之处,还望各位朋友批评指正,共同进步

如果您觉得到文章对您有帮助,欢迎赞赏哦!有您的支持,小麦粒一定会越来越好!

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值