git clone 出现fatal: HTTP request failed, 解决办法

 git  git clone 出现fatal: HTTP request failed, 解决办法已关闭评论
6月 052019
 

在一台centos6机器上安装了git后,使用

$ git clone https://github.com/pyenv/pyenv.git ~/.pyenv安装pyenv时,出现错误

fatal: HTTP request failed,

 

再尝试了下curl:

$ curl https://github.com/pyenv/pyenv.git
curl: (35) SSL connect error

 

解决方法:更新下curl

$ yum update -y nss curl libcurl

 

DONE!

终端使用git命令提示:No user exists for uid 501 问题解决

 git  终端使用git命令提示:No user exists for uid 501 问题解决已关闭评论
4月 092019
 

使用iTerm输入git命令时提示:

No user exists for uid 501 fatal: Could not read from remote repository.
Please make sure you have the correct access rightsand the repository exists.

解决方法:

关掉终端,再打开即可, 晕!

升级完macOS mojave后,git命令出现xcrun 错误解决方法

 git, mac  升级完macOS mojave后,git命令出现xcrun 错误解决方法已关闭评论
3月 292019
 

今天升级macOS 到 macOS mojave,升级完后终端里使用git的时候,弹出一行错误:

xcrun: error: invalid active developer path (/Library/Developer/CommandLineTools), missing xcrun at: /Library/Developer/CommandLineTools/usr/bin/xcrun

解决方法,重装xcode command line:

xcode-select --install

如果没有解决问题,执行以下命令

sudo xcode-select -switch /

DONE!!

git提取出两个版本之间的差异文件并打包

 git  git提取出两个版本之间的差异文件并打包已关闭评论
12月 272017
 

查看id

首先你得知道版本之间的commit id 

$ git log --pretty=oneline

这里写图片描述

差异文件并打包

git diff这个命令能比较两个提交之间的差异,使用–name-only参数可以只显示文件名。由于commit id 太长 一般复制前面7位 就可以了 例如:

$ git diff 61d2112 f3c0f99 --name-only 

这里写图片描述 
git diff列出两个提交之间差异的文件

这个输出结果非常有意思,就是差异文件的相对地址,不正好是压缩命令的参数吗?于是立马使用压缩命令

$ zip update.zip 所有的文件… 
就能成功打包了。只是这样的话也太麻烦了吧,幸好linux有提供一个命令xargs能将前一个命令的输出转成另外一个命令的参数,按照这个思路就非常简单了。

$ git diff 61d2112 f3c0f99 --name-only | xargs zip update.zip
  • 这里写图片描述

git: 提交前查看修改 git diff,git diff HEAD,git diff HEAD^, git diff HEAD~i

 git  git: 提交前查看修改 git diff,git diff HEAD,git diff HEAD^, git diff HEAD~i已关闭评论
5月 252017
 

好文章,分享下http://blog.csdn.net/gw569453350game/article/details/46998395

常用 example:

Git diff:是查看 workspace 与 index 的差别的。 
git diff –cached:是查看 index 与 local repositorty 的差别的。 
git diff HEAD:是查看 workspace 和 local repository 的差别的。(HEAD 指向的是 local repository 中最新提交的版本)

注:git diff 后跟两个参数,如果只写一个参数,表示默认跟 workspace中的代码作比较。git diff 显示的结果为 第二个参数所指的代码在第一个参数所指代码基础上的修改。如,git diff HEAD 表示 workspace 在 最新commit的基础上所做的修改。 
如图: 
这里写图片描述

在git提交环节,存在三大部分:workspace, index, repository 尊重作者,原文链接

这三大部分中:

workspace:就是你所工作在的目录,每当你在代码中进行了修改,working tree的状态就改变了。 
index:是索引文件,它是连接working tree和commit的桥梁,每当·我们使用git-add命令来登记后,index file的内容就改变了,此时index file就和working tree同步了。 
repository:是最后的阶段,只有commit了,我们的代码才真正进入了git仓库。我们使用 git commit -m “xxx” 就是将 index 里的内容提交到本地仓库中(push 之后就到了远程仓库了)。

要跟历史版本中的代码作比较:

git diff HEAD^ 比较 workspace 与最新commit的前一次commit的差异(注意与git diff HEAD的差别) 
git diff HEAD~2 比较 workspace 与上2次提交的差异,相当于 git diff HEAD~2 HEAD~0,注意两个HEAD的位置,diff显示的结果表示 后一个(HEAD~0) 相对于 前一个的修改(HEAD~2) 
git diff HEAD~2 HEAD^ 比较上一次commit(即当前commit的前一次)与上上次commit之间的差异,HEAD^=HEAD^1=HEAD~1

注意^与~之间的区别,当存在多个分支时,^可以用来选择分支,HEAD~i永远只选择第i级父节点的第一个分支,HEAD~i^2选择第i级父节点的第二个分支,以此类推;HEAD^=HEAD^1=HEAD~1;如果没有分支,只有一条主线,则HEAD^^^=HEAD^1^1^1=HEAD~3,如果该级几点有第二个分支,则表示为:HEAD^^^2 = HEAD~2^2. 
图文可见链接

为了更加清晰的阐释这个关系,来给出一个实例:

[yaya@yaya-desktop]$ cat main.c #include<stdio.h> int main(int argc,char *argv[])
{ printf(“hello.\n”); printf(“he was a student.\n”); return 0;
}
	
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

然后git init, git add . , git commit; 
之后你将源代码修改为:

[yaya@yaya-desktop]$ cat main.c #include<stdio.h> int main(int argc,char *argv[])
{ printf(“hello.\n”); printf(“he was a student.\n”); printf(“he was born in finland.\n”); return 0;
}
	
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

此时你git add .,但不用执行git commit命令。然后你再将源代码改为:

[yaya@yaya-desktop]$ cat main.c #include<stdio.h> int main(int argc,char *argv[])
{ printf(“hello.\n”); printf(“he was a student.\n”); printf(“he was born in finland.\n”); printf(“he is very clever!\n”); return 0;
}
	
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

这个时候,你执行如下三个命令,仔细查看,我相信你会发现它们三个的区别的!

$ git diff $ git diff –cached $ git diff HEAD
	
  • 1
  • 2
  • 3
  • 1
  • 2
  • 3

讲到这里,基本上对git diff命令有了比较深入的了解了,现在你再使用git status看看输出结果,样子大概是这样:

[yaya@yaya-desktop]$ git status # On branch master # Changes to be committed: #   (use “git reset HEAD <file>…” to unstage) # #    modified:   main.c # # Changed but not updated: #   (use “git add <file>…” to update what will be committed) # #    modified:   main.c
	
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

很明显可以知道:

Changes to be committed表示已经存在于index file里,但尚未提交。 
Changed but not updated表示在working tree已经做修改,但还没有使用git add登记到index file里。

git中使用多个ssh-key

 开发  git中使用多个ssh-key已关闭评论
5月 102017
 

     我们在日常工作中会遇到公司有个gitlab,还有些自己的一些项目放在github上。这样就导致我们要配置不同的ssh-key对应不同的环境。下面我们来看看具体的操作:

 

1,生成一个公司用的SSH-Key     

$ ssh-keygen -t rsa -C "youremail@yourcompany.com” -f ~/.ssh/id-rsa

 

在~/.ssh/目录会生成id-rsa和id-rsa.pub私钥和公钥。 我们将id-rsa.pub中的内容粘帖到公司gitlab服务器的SSH-key的配置中。

 

2,生成一个github用的SSH-Key

$ ssh-keygen -t rsa -C "youremail@your.com” -f ~/.ssh/github-rsa

在~/.ssh/目录会生成github-rsa和github-rsa.pub私钥和公钥。 我们将github-rsa.pub中的内容粘帖到github服务器的SSH-key的配置中。

 

3,添加私钥

$ ssh-add ~/.ssh/id_rsa $ ssh-add ~/.ssh/github_rsa

如果执行ssh-add时提示”Could not open a connection to your authentication agent”,可以现执行命令:

$ ssh-agent bash

然后再运行ssh-add命令。

# 可以通过 ssh-add -l 来确私钥列表 $ ssh-add -l # 可以通过 ssh-add -D 来清空私钥列表 $ ssh-add -D

 

 

4,修改配置文件

在 ~/.ssh 目录下新建一个config文件

touch config

添加内容:

# gitlab Host gitlab.com
    HostName gitlab.com
    PreferredAuthentications publickey
    IdentityFile ~/.ssh/id_rsa # github Host github.com
    HostName github.com
    PreferredAuthentications publickey
    IdentityFile ~/.ssh/github_rsa

5,目录结构

6,测试

$ ssh -T git@github.com

输出

Hi stefzhlg! You’ve successfully authenticated, but GitHub does not provide shell access.

就表示成功的连上github了.也可以试试链接公司的gitlab.

转自:https://my.oschina.net/stefanzhlg/blog/529403

git命令备忘(含git submodule使用)

 git  git命令备忘(含git submodule使用)已关闭评论
4月 182016
 

网上整理的git命令.

Git配置
git config –global user.name “storm”
git config –global user.email “stormzhang.dev@gmail.com”
git config –global color.ui true
git config –global alias.co checkout  # 别名
git config –global alias.ci commit
git config –global alias.st status
git config –global alias.br branch
git config –global core.editor “vim”  # 设置Editor使用vim
git config –global core.quotepath false # 设置显示中文文件名
用户的git配置文件~/.gitconfig

Git常用命令
查看、添加、提交、删除、找回,重置修改文件
git help <command>  # 显示command的help
git show            # 显示某次提交的内容
git show $id

git co  — <file>   # 抛弃工作区修改
git co  .           # 抛弃工作区修改

git add <file>      # 将工作文件修改提交到本地暂存区
git add .           # 将所有修改过的工作文件提交暂存区

git rm <file>       # 从版本库中删除文件
git rm <file> –cached  # 从版本库中删除文件,但不删除文件

git reset <file>    # 从暂存区恢复到工作文件
git reset — .      # 从暂存区恢复到工作文件
git reset –hard    # 恢复最近一次提交过的状态,即放弃上次提交后的所有本次修改

git ci <file>
git ci .
git ci -a           # 将git add, git rm和git ci等操作都合并在一起做
git ci -am “some comments”
git ci –amend      # 修改最后一次提交记录

git revert <$id>    # 恢复某次提交的状态,恢复动作本身也创建了一次提交对象
git revert HEAD     # 恢复最后一次提交的状态
查看文件diff
git diff <file>     # 比较当前文件和暂存区文件差异
git diff
git diff <$id1> <$id2>   # 比较两次提交之间的差异
git diff <branch1>..<branch2> # 在两个分支之间比较 
git diff –staged   # 比较暂存区和版本库差异
git diff –cached   # 比较暂存区和版本库差异
git diff –stat     # 仅仅比较统计信息
查看提交记录
git log
git log <file>      # 查看该文件每次提交记录
git log -p <file>   # 查看每次详细修改内容的diff
git log -p -2       # 查看最近两次详细
tig
Mac上可以使用tig代替diff和log,brew install tig

Git 本地分支管理
查看、切换、创建和删除分支
git br -r           # 查看远程分支
git br <new_branch> # 创建新的分支
git br -v           # 查看各个分支最后提交信息
git br –merged     # 查看已经被合并到当前分支的分支
git br –no-merged  # 查看尚未被合并到当前分支的分支

git co <branch>     # 切换到某个分支
git co -b <new_branch> # 创建新的分支,并且切换过去
git co -b <new_branch> <branch>  # 基于branch创建新的new_branch

git co $id          # 把某次历史提交记录checkout出来,但无分支信息,切换到其他分支会自动删除
git co $id -b <new_branch>  # 把某次历史提交记录checkout出来,创建成一个分支

git br -d <branch>  # 删除某个分支
git br -D <branch>  # 强制删除某个分支 (未被合并的分支被删除的时候需要强制)
分支合并和rebase
git merge <branch>               # 将branch分支合并到当前分支
git merge origin/master –no-ff  # 不要Fast-Foward合并,这样可以生成merge提交

git rebase master <branch>       # 将master rebase到branch,相当于:
git co <branch> && git rebase master && git co master && git merge <branch>
Git补丁管理(方便在多台机器上开发同步时用)
git diff > ../sync.patch         # 生成补丁
git apply ../sync.patch          # 打补丁
git apply –check ../sync.patch  # 测试补丁能否成功
Git暂存管理
git stash                        # 暂存
git stash list                   # 列所有stash
git stash apply                  # 恢复暂存的内容
git stash drop                   # 删除暂存区
git stash clear
Git远程分支管理
git pull                         # 抓取远程仓库所有分支更新并合并到本地
git pull –no-ff                 # 抓取远程仓库所有分支更新并合并到本地,不要快进合并
git fetch origin                 # 抓取远程仓库更新
git merge origin/master          # 将远程主分支合并到本地当前分支
git co –track origin/branch     # 跟踪某个远程分支创建相应的本地分支
git co -b <local_branch> origin/<remote_branch>  # 基于远程分支创建本地分支,功能同上

git push                         # push所有分支
git push origin master           # 将本地主分支推到远程主分支
git push -u origin master        # 将本地主分支推到远程(如无远程主分支则创建,用于初始化远程仓库)
git push origin <local_branch>   # 创建远程分支, origin是远程仓库名
git push origin <local_branch>:<remote_branch>  # 创建远程分支
git push origin :<remote_branch>  #先删除本地分支(git br -d <branch>),然后再push删除远程分支
Git远程仓库管理
git remote -v                    # 查看远程服务器地址和仓库名称
git remote show origin           # 查看远程服务器仓库状态
git remote add origin git@github:stormzhang/demo.git         # 添加远程仓库地址
git remote set-url origin git@github.com:stormzhang/demo.git # 设置远程仓库地址(用于修改远程仓库地址
创建远程仓库
git clone –bare robbin_site robbin_site.git  # 用带版本的项目创建纯版本仓库
scp -r my_project.git git@git.csdn.net:~      # 将纯仓库上传到服务器上

mkdir robbin_site.git && cd robbin_site.git && git –bare init # 在服务器创建纯仓库
git remote add origin git@github.com:robbin/robbin_site.git    # 设置远程仓库地址
git push -u origin master                                      # 客户端首次提交
git push -u origin develop  # 首次将本地develop分支提交到远程develop分支,并且track

git remote set-head origin master   # 设置远程仓库的HEAD指向master分支
也可以命令设置跟踪远程库和本地库

git branch –set-upstream master origin/master
git branch –set-upstream develop origin/develop

开发过程中,经常会有一些通用的部分希望抽取出来做成一个公共库来提供给别的工程来使用,而公共代码库的版本管理是个麻烦的事情。而且一旦更新了就要同步到多个引用的系统中,这个时候使用git submodule,然后执行: git submodule update就全部搞定了。

下面就以Android开发为例,讲述下submodule的具体用法。

假设一个Android Demo的目录是这样的:app, extras。其中app是程序的主要目录,extras目录是引用的一些library, 比如程序中引用了volley的library.

添加
为当前工程添加submodule,命令如下:

git submodule add 仓库地址 路径

git submodule add https://android.googlesource.com/platform/frameworks/volley extras
命令执行完成,会在当前工程根路径下生成一个名为“.gitmodules”的文件,其中记录了子模块的信息。添加完成以后,再将子模块所在的文件夹添加到工程中即可。

更新
如果过了一段时间volley库有更新,这时候我们的app也需要更新,命令如下:

git submodule update
删除
ubmodule的删除稍微麻烦点:首先,要在“.gitmodules”文件中删除相应配置信息。然后,执行“git rm –cached ”命令将子模块所在的文件从git中删除。

下载的工程带有submodule
当使用git clone下来的工程中带有submodule时,初始的时候,submodule的内容并不会自动下载下来的,此时,只需执行如下命令:

git submodule update –init –recursive
即可将子模块内容下载下来后工程才不会缺少相应的文件。

摘自:http://stormzhang.com/git/2014/01/27/git-common-command/

git submodule用法

 git  git submodule用法已关闭评论
3月 012016
 

今天工作中碰到一个git命令 git submodule,记录下用法:


开发过程中,经常会有一些通用的部分希望抽取出来做成一个公共库来提供给别的工程来使用,而公共代码库的版本管理是个麻烦的事情。而且一旦更新了就要同步到多个引用的系统中,这个时候使用git submodule,然后执行: git submodule update就全部搞定了。

下面就以Android开发为例,讲述下submodule的具体用法。

假设一个Android Demo的目录是这样的:app, extras。其中app是程序的主要目录,extras目录是引用的一些library, 比如程序中引用了volley的library.

添加

为当前工程添加submodule,命令如下:

git submodule add 仓库地址 路径  git submodule add https://android.googlesource.com/platform/frameworks/volley extras

命令执行完成,会在当前工程根路径下生成一个名为“.gitmodules”的文件,其中记录了子模块的信息。添加完成以后,再将子模块所在的文件夹添加到工程中即可。

更新

如果过了一段时间volley库有更新,这时候我们的app也需要更新,命令如下:

git submodule update

删除

ubmodule的删除稍微麻烦点:首先,要在“.gitmodules”文件中删除相应配置信息。然后,执行“git rm –cached ”命令将子模块所在的文件从git中删除。

下载的工程带有submodule

当使用git clone下来的工程中带有submodule时,初始的时候,submodule的内容并不会自动下载下来的,此时,只需执行如下命令:

git submodule update --init --recursive

即可将子模块内容下载下来后工程才不会缺少相应的文件。

转自:http://www.stormzhang.com/git/2014/02/13/git-submodule/

11月 262013
 

摘录自:http://www.worldhello.net/gotgithub/03-project-hosting/010-new-project.html

创建新项目

1.1. 新版本库即是新项目

在GitHub,一个项目对应唯一的Git版本库,创建一个新的版本库就是创建一个新的项目。访问仪表板(Dashboard)页面,如图3-1,可以看到关注的版本库中已经有一个,但自己的版本库为零。在显示为零的版本库列表面板中有一个按钮“New Repository”,点击该按钮开始创建新版本库。

../images/new-repo-btn.png

图3-1:版本库列表面板

新建版本库的界面如图3-2所示。

../images/new-project.png

图3-2:创建新项目

我们为新建立的版本库命名为“helloworld”,相应的项目名亦为“helloworld”,创建完毕后访问项目页,提示版本库尚未初始化,并给出如何初始化版本库的帮助,如图3-3所示。

../images/project-uninitial.png

图3-3:项目尚未初始化

在图3-3中可以看到访问协议增加了一个支持读写的SSH协议,访问地址为:git@github.com:gotgithub/helloworld.git。注意任何GitHub用户均可使用该URL访问此公开版本库,但只有版本库建立者gotgithub具有读写权限,其他人只有只读权限。在初始化版本库之前,最好先确认是否是用正确的公钥进行认证,如下:

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

1.2. 版本库初始化

如果是从头创建版本库,可以采用先克隆,建立提交数据,最后再通过推送完成GitHub版本库的初始化。步骤如下:

  • 克隆版本库。

    克隆过程会显示警告,不过这个警告可以忽略,因为GitHub创建的版本库本来就是一个空白的版本库。

    $ git clone git@github.com:gotgithub/helloworld.git
    Cloning into 'helloworld'...
    warning: You appear to have cloned an empty repository.

  • 创建文件README.md[1]

    下面是一段示例文字,把这段文字保存为文件README.md,该文件的内容将会直接显示在项目首页中(显示效果参见后面的图3-5)。

    # 我的第一个GitHub项目
    
    这是项目 [helloworld](https://github.com/gotgithub/helloworld) ,
    欢迎访问。
    
    这个项目的版本库是 **Git格式** ,在 Windows、Linux、Mac OS X
    平台都有客户端工具可以访问。虽然版本库只提供Git一种格式,
    但是你还是可以用其他用其他工具访问,如 ``svn`` 和 ``hg`` 。
    
    ## 版本库地址
    
    支持三种访问协议:
    
    * HTTP协议: `https://github.com/gotgithub/helloworld.git` 。
    * Git协议: `git://github.com/gotgithub/helloworld.git` 。
    * SSH协议: `ssh://git@github.com/gotgithub/helloworld.git` 。
    
    ## 克隆版本库
    
    操作示例:
    
        $ git clone git://github.com/gotgithub/helloworld.git

    上面这段文字采用Markdown格式,您也可以使用其他支持的格式,只要确保README文件使用正确的扩展名。本书附录部分介绍了Markdown及其他GitHub支持的标记语言。关于Markdown,目前我们只需知道这一个易于识别和理解的纯文本格式,可以方便的转换为HTML。Markdown语法非常像我们在写邮件(纯文本)时用空行来分隔段落、用星号开启列表、用缩进表示引用内容等等。

  • 添加README.md文件并提交。

    $ git add README.md
    $ git commit -m "README for this project."

  • 向GitHub推送,完成版本库初始化。

    $ git push origin master

然后查看GitHub上新建项目的首页。项目首页的上半部分可见版本库包含了一个新的提交,以及版本库目录树中包含的文件,如图3-4所示。

../images/project-pushed-head.png

图3-4:完成推送后的项目首页上半部分

在项目首页的下半部分,会看到README.md文件被转换为HTML显示,如图3-5所示。

../images/project-pushed-tail.png

图3-5:完成推送后的项目首页下半部分

1.3. 从已有版本库创建

如果在GitHub项目初始化之前,数据已经存在于本地版本库中,显然像上面那样先克隆、再提交、后推送的方法就不适宜了。应该采用下面的方法。

为试验新的版本库初始化方法,先把刚刚新建的测试项目“helloworld”删除,同时也将本地工作区中克隆的“helloworld”删除。警告:删除项目的操作非常危险,不可恢复,慎用。

  • 点击项目首页中项目名称旁边的“Admin”按钮进入项目管理页,再点击页面最下方的删除版本按钮,如图3-6所示。

    ../images/project-delete.png

    图3-6:删除项目

  • 然后再重建版本库“helloworld”,如本章一开始图3-2所示。

接下来使用下面的步骤完成“helloworld”版本库的初始化。

  • 本地建立一个Git版本库。

    $ mkdir helloworld
    $ cd helloworld
    $ git init

  • 然后在版本库中添加示例文件,如README.md文件,内容同前。

    $ git add README.md
    $ git commit -m "README for this project."

  • 为版本库添加名为origin的远程版本库。

    $ git remote add origin git@github.com:gotgithub/helloworld.git

  • 执行推送命令,完成GitHub版本库的初始化。注意命令行中的-u参数,在推送成功后自动建立本地分支与远程版本库分支的追踪。

    $ git push -u origin master


[1] 以扩展名.md.mkd.mkdn.mdown.markdown等为结尾的文件,均以Markdown标记语言语法进行解析并显示。