0%

Git (by SSH)

SSH 以及 Git的学习及使用笔记

git使用

创建版本库

1
2
3
$ mkdir gitfile
$ cd gitfile
$ git init

链接远程版本库

在本地仓库文件夹下执行命令

1
git remote add origin git@github.com:username/username.git

然后执行推送命令

1
git push -u origin master 

更换远程库

1
2
3
4
5
# 先删除本地已添加的远程库
git remote rm origin

# 再添加新的远程库
git remote add origin git@github.com:username/username.git

同一系统下使用多个“git提供商”的SSH配置

修改 ~/.ssh/config文件对应相应的SSH文件

1
2
3
4
5
6
# config配置 
Host git.oschina.net
HostName git.oschina.net
Port 端口 //可以不写
User 用户名 //可以不写
IdentityFile ~/.ssh/cjb //密钥文件的路径

同时需要把不同HOST对应的公钥分发到对应的不同的主机中,普通主机需要添加在./ssh/authorized_keys中。

只克隆git仓库中的一个分支

1
这就是答案啊 git clone -b <branch> <remote_repo> 例如: git clone -b 指定的分支名字

命令使用

基本命令

Setup1:git add file 把文件添加到暂存区
Setup2:git commit 把暂存区文件提交到当前分支
Setup3:git push 把文件推送到远程服务器

其它常用

git diff 查看文件修改了哪里,与上次有哪些不同
git log 查看文件被那些人修改了,以及修改说明
git log --pretty=oneline 上一命令的信息简化
git log --graph 查看分支合并图
git reflog 查看在git中的每一次操作的命令
git reset 撤销add操作
git reset --hard HESD^ 恢复到上一个版本
git reset --hard HEAD^^ 恢复到上二个版本
git reset --hard HEAD~100 恢复到上100个版本
git reset --hard 3628164 恢复到ID为3628164…的版本
git reset HEAD file 当修改文件仅仅被保存到暂存区时,需要撤销修改的第一个命令
git checkout file 当修改文件仅仅被保存到暂存区时。需要撤销修改时第二个命令 或是 未做任何保存时的撤销命令
git branch 查看分支
git branch <name> 创建分支
git chekout <name> 切换分支
git merge <name> 合并某分支到当前分支
git branch -d <name> 删除分支
git tag v1.4 创建轻量标签
git tag -a v1.4 -m 'my version 1.4 创建含附注的标签
git tag 查看所有标签
git show 查看某一标签信息
git tag -a v1.2 9fceb02 后期加注标签
git push origin v1.5 分享特定版本号标签
git push origin --tags 一次性推送所有标签

关于文件的删除

直接执行 rm file 命令 ,导致工作区与版本库内容不一致,分下面的两种情况

情况一:确实需要删除

1
2
git rm file
git commit -m "rm"

情况二: 需要恢复

1
git checkout -- file

同步远程分支到本地

git pull:获取最新代码到本地,并自动合并到当前分支

1
2
3
4
5
//查询当前远程分支
$ git remote -v
//直接拉取并合并最新代码
$ git pull origin master [示例1:拉取远端origin/master分支合并到本地当前分支]
$ git pull origin dev [示例2:拉取远端origin/dev分支合并到本地当前分支]

git fetch + merge: 获取最新代码到本地,然后手动合并分支

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
# 方法一 :额外建立分支,然后合并,间接达成目的
//查看当前远程的版本
$ git remote -v

//获取最新代码到本地临时分支(本地当前分支为[branch],获取的远端的分支为[origin/branch])
$ git fetch origin master:master1 //[示例1:在本地建立master1分支,并下载远端的origin/master分支到master1分支中]
$ git fetch origin dev:dev1 //[示例1:在本地建立dev1分支,并下载远端的origin/dev分支到dev1分支中]

//查看版本差异
$ git diff master1 //[示例1:查看本地master1分支与当前分支的版本差异]
$ git diff dev1 //[示例2:查看本地dev1分支与当前分支的版本差异]

//合并最新分支到本地分支
$ git merge master1 //[示例1:合并本地分支master1到当前分支]
$ git merge dev1 //[示例2:合并本地分支dev1到当前分支]

//删除本地临时分支
$ git branch -D master1 //[示例1:删除本地分支master1]
$ git branch -D dev1 //[示例1:删除本地分支dev1]

# 方法二 :不额外建立本地分支
//查询当前远程的版本
$ git remote -v

//获取最新代码到本地(本地当前分支为[branch],获取的远端的分支为[origin/branch])
$ git fetch origin master //[示例1:获取远端的origin/master分支]
$ git fetch origin dev //[示例2:获取远端的origin/dev分支]

//查看版本差异
$ git log -p master..origin/master //[示例1:查看本地master与远端origin/master的版本差异]
$ git log -p dev..origin/dev // [示例2:查看本地dev与远端origin/dev的版本差异]

//合并最新代码到本地分支
$ git merge origin/master //[示例1:合并远端分支origin/master到当前分支]
$ git merge origin/dev //[示例2:合并远端分支origin/dev到当前分支]

解释
git fetch是将远程主机的最新内容拉到本地,用户在检查了以后决定是否合并到工作本机分支中。 而git pull 则是将远程主机的最新内容拉下来后直接合并,即:git pull = git fetch + git merge,这样可能会产生冲突,需要手动解决。

git错误

fatal: Not a git repository (or any of the parent directories): .git

错误提示

1
fatal: Not a git repository (or any of the parent directories): .git

使用命令:

1
git add *

解决办法:

1
git init

error: 无法推送一些引用到

错误提示

1
2
3
4
5
error: 无法推送一些引用到 'https://github.com/momoxiangbei/php.git'
提示:更新被拒绝,因为远程版本库包含您本地尚不存在的提交。这通常是因为另外
提示:一个版本库已向该引用进行了推送。再次推送前,您可能需要先整合远程变更
提示:(如 'git pull ...')。
提示:详见 'git push --help' 中的 'Note about fast-forwards' 小节。

使用命令

1
git push

解决办法
究其原因,远程有本地不存在的文件,需要使用git push --force
或是删除远程库中不同的文件(不推荐)

error:src refspec master does not match any

错误提示

1
error:src refspec master does not match any

使用的命令
在使用完git init后,直接使用git remote add origin git@git.oschina.next:xfnotes/Node-blog.git,然后又使用git push -u origin master
解决办法
没有使用git add file导致的错误,应依次使用

1
2
git add file
git commit

warning:LF will be replaced by CRLF

此种情况一般为windows下使用git时出现的情况
** 原因 **
windows中的换行符为 CRLF, 而在linux下的换行符为LF,所以在执行add . 时出现 warning:LF will be replaced by CRLF
** 解决办法 **

1
2
$ rm -rf .git  
$ git config --global core.autocrlf false //禁用自动转换

此错误在我配置window的git时遇到的,解决方法来源于unity的博客

配置ssh之后,git push 仍然需要输入账号密码

** 原因 **
多种情况,其中一种是在.ssh中缺少config文件,配置对应的密钥,另一种是因为配置remote远程库时,使用的时https连接,而不是git@链接,下面针对第二种情况做一个解决方案。
** 解决办法 **
无非就是更换httpsgit@类型的远程链接

1
2
3
4
5
# 方法1
git remote origin set-url [url]
# 方法2 先删后加
git remote rm origin
git remote add origin [url]

使用第二种方法之后再push极易出现问题fatal: The current branch master has no upstream branch. To push the current

这样的原因很简单——表示本地分支与远程分支之间没有连接起来,所以在push 的时候报错。
解决办法:git push -u origin dev(远程分支名)

SSH

首先,要明白 公钥和私钥 是可以任何人持有的。

SSH在linux中使用终端登录远程linux服务器

  1. 拥有一对 秘钥-私钥、公钥
  2. 把公钥分发到远程linux服务器的./ssh下的authorized_keys文件中
  3. 把相应的私钥分发到自己的本地linux的./ssh下,并在本文件夹下的config中做好配置
  4. 打开本地的linux终端,输入ssh 远程服务器的username@ip地址即可

从一台”电脑a”复制id_rsa到另一台”电脑b”,在”电脑b”使用git clone时提示 Permissions 0644 for ‘/root/.ssh/id_rsa’ are too open

** 原因分析 **
ssh的私有密钥的权限过于开发,可以供人随意欣赏了,ssh自身的策略关闭了ssh。摘自立体风

** 解决措施 **

1
chmod 0600 /root/.ssh/id_rsa  //将权限由0644降低为0600