Git版本控制:Git远程仓库

http://blog.csdn.net/pipisorry/article/details/44671529

流程总结

在github上创建完一个repository或者create a new repository on the command line
在本地的某个要使用git版本控制的目录下
git init
添加exclude
git add .
git commit -m "first commit"
git remote add origin git@github.com:***/***.git
git push -u origin master

…or push an existing repository from the command line
git remote add origin git@github.com:***/***.git
git push -u origin master
Note: 上面就是来自在github上创建完一个repository后的提示。

本地操作

Git仓库

已经存在一个本地库,想在GitHub创建一个Git远程仓库,并且让这两个仓库远程同步。

[Git版本控制教程 - Git本地仓库]

git status

git status不显示本地仓库领先远端几次提交信息的解决办法

git branch --set-upstream-to origin/remote

git branch --set-upstream local origin/remote(版本1.8之前)

创建SSH Key

Note: 更新系统后,ssh保存的key什么的可能重置,需要重新安装或者只需要重新生成。

1 查看用户主目录下,是否已经有了.ssh目录,且包含id_ed25519和id_ed25519.pub文件。

Note: GitHub 在 2022 年 3 月 15 日之后将不再支持 RSA 算法生成的密钥,原因是 RSA 不够安全。所以可以使用 ed25519。否则报错You‘re using an RSA key with SHA-1, which is no longer allowed. Please use a newer client。

2 如果没有,打开Shell(Windows下打开Git Bash),创建SSH Key:

$ssh-keygen -t ed25519 -C "***@126.com"

一路回车,使用默认值即可,无需设置密码, 这里一般不使用密钥。

打开id_ed25519.pub文件,复制其中的内容,后面到github上操作。id_ed25519.pub是公钥,可以放心地告诉任何人。

Note: 当然之前rsa 版本的命令是$ ssh-keygen -t rsa -C "***@126.com",对应生成的文件是id_rsa.pub。

bug修复:

The authenticity of host *** can't be established. ECDSA key fingerprint is ***. This key is not known by any other names Are you sure you want to continue connecting (yes/no/[fingerprint])? 
这时输入yes(不能只回车)就会自动生成并连接成功。

设置用户名和密码

这个如果不需要,可以不设置。

设置用户名

$ git config --global user.name "***"

$ git config --global user.email "***@126.com"

Note: 查看当前的git用户名以及email: git config --global --list

git config --local --list。

设置密码

Note:

1 密码可能是user setteing里面的access_tokens,比如gitlab,进入之后设置一个access_tokens作为登录密码。

2 You won't be able to pull or push project code via HTTPS until you set a password on your account。通过gitlab这个提示可看出,access_tokens(应该就是password)是用来通过https来pull/push用的。

每次git pull或者push都需要输入用户名和密码的问题

进入项目目录,输入:git config --global credential.helper store

再操作一次git pull,然后它会提示你输入账号密码,这一次之后就不需要再次输入密码了。

Git远程仓库设置

创建远程仓库

GitHub或者gitlab网站就是提供Git仓库托管服务的,只要注册一个GitHub账号,就可以免费获得Git远程仓库。

https://github.com/注册用户并创建项目。

登陆GitHub > 右上角“Create a newrepo” > 创建新的仓库。

Note: 注意git管理是可以嵌套的,一个大目录(对应远程的repository1)下面可以有好多小目录(对应远程的repository2-n),push后也会对应到不同远程中。

Git远程仓库ssh设置

找到公钥 (linux: cat ~/.ssh/id_ed25519.pub;  windows: C:\Users\pi\.ssh\id_ed25519.pub)

打开id_ed25519.pub文件,复制其中的内容

“settings” > “SSH and GPG Keys” > “new SSH Key” > 填上Title(如ubuntu_acer) > 在Key文本框里粘贴pub文件的内容 > “Add Key”

Note: GitHub允许你添加多个Key。假定你有若干电脑,你一会儿在公司提交,一会儿在家里提交,只要把每台电脑的Key都添加到GitHub,就可以通过ssh在每台电脑上往GitHub推送了。

为什么GitHub需要SSH Key呢?因为GitHub需要识别出你推送的提交确实是你推送的,而不是别人冒充的,而Git支持SSH协议,所以,GitHub只要知道了你的公钥,就可以确认只有你自己才能推送。

皮皮Blog

使用远程库

添加远程仓库git remote add

git remote add <alias><remote address>

在本地的python_workspace仓库(当前git目录)下运行命令:

$ git remote add origin git@github.com:***.git

Note:

1 点击repository的https右边的ssh就会出现对应的ssh地址git@github.com:***。

注意只有ssh地址能推送数据上去,http不行,但是可以通过 HTTP 克隆和获取仓库的内容。

http换成https可能会导致pull失败:Received HTTP code 400 from proxy after CONNECT

3. 添加后,远程库的名字就是origin,这是Git默认的叫法,也可以改成别的,但是origin这个名字一看就知道是远程库。如果提示已经存在这个远程库名,可以改成另一个名字。

git变更项目地址

git remote set-url origin git@***.git

git remote -v

取消本地目录下关联的远程库

git remote remove origin

查看git提交和拉取对应的远程库

$ git remote -v
origin  git://github.com/***/***.git (fetch)
origin  git://github.com/***/***.git (push)

提交代码到远程库git push

git push <alias><branch name>

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

$ git push -u origin master

或者也可以设置git push --set-upstream origin master,之后就直接使用$ git push即可。

Note:

1 如果在github上已经创建了一个readme.md,则先要执行git pull origin master将readme.md拉取下来,保持远程和本地数据一致,不然就会git push失败。

2 Git 2.x 默认的push行为是 simple,意味着执行 git push 没有指定分支时,只有当前分支会被 push 到你使用 git pull 获取的代码。

从现在起,只要本地作了提交,就可以通过命令把本地master分支的最新修改推送至GitHub。

git push (使用当前分支并push到远程对应分支)

git push origin dev (指定分支push)

将所有本地分支都推送到origin主机

git push --all origin

--force选项

如果远程主机的版本比本地版本更新,推送时Git会报错,要求先在本地做git pull合并差异,然后再推送到远程主机。
但是git pull 相当于 git fetch 加上 git merge,远程版本会将reset前的信息代入,这时,如果你不想要reset前的信息,一定要推送,可以使用--force选项。
$ git push -f 或者 git push --force origin 
上面命令使用--force选项,结果导致远程主机上更新的版本被覆盖。除非你很确定要这样做,否则应该尽量避免使用--force选项。

[git push冲突解决]

push之前查看push的内容

git diff origin/dev...HEAD --name-status

常用:git diff origin/master...HEAD --name-only | xargs ls -lh

Note: dev可以为任何分支名;去掉--name-status则显示每个文件的具体变化,加上则只显示有变化的文件。显示结果中D代表delete的文件;A代表add的文件;M代表modified的文件。

从远程库拉取分支git pull

查看所有远程分支

git branch -r

pull之前查看本地和远程的区别

先更新下本地的远程分支

git fetch origin

然后可以比对

git diff --name-only HEAD FETCH_HEAD

git diff --name-only FETCH_HEAD HEAD^ #远程和本地上个版本区别

Note: 

1 --name-only表示只显示修改的文件,不显示改动具体内容。

2 上一个版本就是HEAD^,上上一个版本就是HEAD^^,当然往上100个版本写100个^比较容易数不过来,所以写成HEAD~100。

git pull <alias> <branch name>

git pull origin dev

也可以直接git pull直接拉取不指定分支。

Note:

1 不过不在master分支上时git pull远程代码到本地可能需要先设置一下远程和本地分支的对应:$git branch --set-upstream-to=origin/dev dev
Branch dev set up to track remote branch dev from origin.但是有可能出错:error: the requested upstream branch 'origin/dev' does not exist。那就用git pull --set-upstream origin dev。

2 远程已有更新,但是git pull时,还是显示Already up to date.
如果没有显示From abc \n * branch   dev -> FETCH_HEAD那就是有问题
解决:要么每次都用git pull origin dev;要么配置一下git pull --set-upstream origin dev

git pull merge规则

git2.0以上的git pull规则好像是这样的:如果远程的文件比本地新(修改时间),则会与本地合并,生成<===标记的冲突来手动解决(pull后直接输入命令git mergetool);如果远程文件比本地旧,则本地文件并不会改变,仍和远程不一样。

git pull实际是git fetch和git merge,只是它把过程的细节都隐藏了起来,以至于你不用去了解git中各种类型分支的区别和使用方法。

bug fix

1 git pull时如果出错:error: cannot lock ref refs/remotes/origin/*** : is at 123abc but expected 234bcd?

解决:git pull origin master即可解决 [git pull时遇到error: cannot lock ref的错误]

2 The following untracked working tree files would be overwritten by merge?

原因:Error 所列出的文件在本地的当前分支下未授权给 git 追踪,但同样命名的文件(另一个(远程)分支下的同一文件)却正在远程仓库或其它分支被 git 进行追踪。进行(git merge/checkout …)操作使得 git 需要呈现的是远程或另一个分支下被追踪的同名文件,但 git 并不知道该如何处理当前状态下这些未被追踪的同名文件,请求你将它们移开或删除,从而在你想要进行的操作之后直接呈现这些文件在目标状态下的版本。
解决:如果你想保留这些未追踪文件的变化。你就把他们加到git追踪中,或者从exclude中移除。
不想要本地这些文件了,直接移到其它地方或者删除了都ok。

在本地新建分支x并拉取远程代码

git fetch origin 远程分支名x:本地分支名x

其它分支的提交

>>dev
git checkout -b dev
git push -u origin dev

Git pull冲突处理

[Git冲突解决]

git子项目submodule

开发过程中,经常会有一些通用的部分希望抽取出来做成一个公共库来提供给别的工程来使用。

为当前工程添加submodule

git submodule add 仓库地址 路径

Note:

1. 仓库地址是指子模块仓库地址,路径指将子模块放置在当前工程下的路径。
2. 路径不能以 / 结尾(会造成修改不生效)、不能是现有工程已有的目录(不能順利 Clone)

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

或者通过这样来配置:
git submodule init
git config submodule.子目录/a.url http://gitlab.aaa.com/xrec/a.git
git config submodule.b.url http://gitlab.aaa.com/xrec-pml/b.git
#如果分支里有 对应 的 submodule, 可以使用下面命令修改这个库的链接
git submodule update --remote

删除git子项目

首先删除.gitmodules文件中相应配置信息。然后git rm –cached命令将子模块所在的文件从git中删除。

下载带有submodule的工程

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

git submodule update --init --recursive

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

从远程库克隆git clone

我们可以先有远程库,然后从远程库克隆,这个远程库不一定是自己创建的。

$ git clone git@github.com:abc/bcd.git

$ git clone --depth 1 https://github.com/abc/bcd.git

$ git clone --depth 1 --branch dev https://github.com/abc/bcd.git

参数:--depth 1    代表克隆仓库的最新几个版本;

--branch dev    只克隆某个指定分支。

clone的地址如果是ssh地址,要先进行ssh设置,否则出错:Permission denied (publickey).fatal: Could not read from remote repository.Please make sure you have the correct access rights and the repository exists. 如果不想设置,当然也可以clone https地址,同样可以下载好。

也可以直接下载rar压缩文件,这样下载下来的项目中没有.git,但是下载的文件最全。(git clone有时候clone不下来所有的文件,不知道项目怎么设置了,有的目录是clone不下来的)

出错:git clone OpenSSL SSL_read: Connection was reset, errno 10054

解决方法如下:
方法一:git bash修改设置,解除ssl验证(git命令行输入如下代码)
git config --global http.sslVerify "false"

方法二:cmd命令行-清理缓存
按住 win + r,打开运行窗口
输入cmd,打卡cmd命令行
输入命令ipconfig/flushdns
完成清理缓存的效果

方法三:

大部分是网络问题导致。有时候换个终端或者过一会就ok了。比如从windows powershell换成anaconda powershell prompt就没问题。

从github远程库上下载单个文件或文件夹

打开GitZip输入文件或文件夹的地址进行下载。

下载前需要添加API Access Token,否则会提示Error: url not valid。添加Token直接点击Get Token,github授权, 下载token文件后打开复制token到下图的框框中就可以成功下载了。

[其它可能的方式Download a single folder or directory from a GitHub repo]

[如何在github上下载单个文件夹?]

皮皮Blog

搭建Git服务器

在远程仓库中,我们知道远程仓库实际上和本地仓库没啥不同,纯粹为了7x24小时开机并交换大家的修改。

GitHub就是一个免费托管开源代码的远程仓库。但是对于某些视源代码如生命的商业公司来说,既不想公开源代码,又舍不得给GitHub交保护费,那就只能自己搭建一台Git服务器作为私有仓库使用。

搭建Git服务器需要准备一台运行Linux的机器,强烈推荐用Ubuntu或Debian,这样,通过几条简单的apt命令就可以完成安装。

sudo权限的用户账号,开始安装git

第一步,安装git

$ sudo apt-get install git

第二步,创建一个git用户,用来运行git服务:

$ sudo adduser git

第三步,创建证书登录:

收集所有需要登录的用户的公钥,就是他们自己的id_rsa.pub文件,把所有公钥导入到/home/git/.ssh/authorized_keys文件里,一行一个。

第四步,初始化Git仓库:

先选定一个目录作为Git仓库,假定是/srv/sample.git,在/srv目录下输入命令:

$ sudo git init --bare sample.git

Git就会创建一个裸仓库,裸仓库没有工作区,因为服务器上的Git仓库纯粹是为了共享,所以不让用户直接登录到服务器上去改工作区,并且服务器上的Git仓库通常都以.git结尾。然后,把owner改为git

$ sudo chown -R git:git sample.git

第五步,禁用shell登录:

出于安全考虑,第二步创建的git用户不允许登录shell,这可以通过编辑/etc/passwd文件完成。找到类似下面的一行:

git:x:1001:1001:,,,:/home/git:/bin/bash

改为:

git:x:1001:1001:,,,:/home/git:/usr/bin/git-shell

这样,git用户可以正常通过ssh使用git,但无法登录shell,因为我们为git用户指定的git-shell每次一登录就自动退出。

第六步,克隆远程仓库:

现在,可以通过git clone命令克隆远程仓库了,在各自的电脑上运行:

$ git clone git@server:/srv/sample.git
Cloning into 'sample'...
warning: You appear to have cloned an empty repository.

剩下的推送就简单了。

管理公钥

如果团队很小,把每个人的公钥收集起来放到服务器的/home/git/.ssh/authorized_keys文件里就是可行的。如果团队有几百号人,就没法这么玩了,这时,可以用Gitosis来管理公钥。

这里我们不介绍怎么玩Gitosis了,几百号人的团队基本都在500强了,相信找个高水平的Linux管理员问题不大。

管理权限

有很多不但视源代码如生命,而且视员工为窃贼的公司,会在版本控制系统里设置一套完善的权限控制,每个人是否有读写权限会精确到每个分支甚至每个目录下。因为Git是为Linux源代码托管而开发的,所以Git也继承了开源社区的精神,不支持权限控制。不过,因为Git支持钩子(hook),所以,可以在服务器端编写一系列脚本来控制提交等操作,达到权限控制的目的。Gitolite就是这个工具。这里不介绍Gitolite了,不要把有限的生命浪费到权限斗争中。

from:Git版本控制:Git远程仓库_皮皮blog-CSDN博客

ref:Git版本控制教程 - Github的使用

pycharm中进行git版本控制

http://www.liaoxuefeng.com/

目前世界上最为流行的代码托管网站

  • 4
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值