
http://blog.csdn.net/pipisorry/article/details/44671529流程总结在github上创建完一个repository或者create a new repository on the command line在本地的某个要使用git版本控制的目录下git init添加excludegit add .git commit -m first commitgit remote add origin gitgithub.com:***/***.gitgit push -u origin master…or push an existing repository from the command linegit remote add origin gitgithub.com:***/***.gitgit push -u origin masterNote: 上面就是来自在github上创建完一个repository后的提示。本地操作Git仓库已经存在一个本地库想在GitHub创建一个Git远程仓库并且让这两个仓库远程同步。[Git版本控制教程 - Git本地仓库]git statusgit status不显示本地仓库领先远端几次提交信息的解决办法git branch --set-upstream-to origin/remotegit branch --set-upstream local origin/remote(版本1.8之前)创建SSH KeyNote: 更新系统后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 如果没有打开ShellWindows下打开Git Bash创建SSH Keyssh-keygen -t rsa一路回车使用默认值即可无需设置密码 这里一般不使用密钥。打开id_ed25519.pub文件复制其中的内容后面到github上操作。id_ed25519.pub是公钥可以放心地告诉任何人。$ssh-keygen -t ed25519 -C ***126.comNote: 当然之前rsa 版本的命令是$ ssh-keygen -t rsa -C ***126.com对应生成的文件是id_rsa.pub。bug修复The authenticity of host *** cant 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.comNote:查看当前的git用户名以及email: git config --global --listgit config --local --list。设置密码Note:1 密码可能是user setteing里面的access_tokens比如gitlab进入之后设置一个access_tokens作为登录密码。2 You wont 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-npush后也会对应到不同远程中。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 addgit remote add aliasremote address在本地的python_workspace仓库(当前git目录)下运行命令$ git remote add origin gitgithub.com:***.gitNote:1 点击repository的https右边的ssh就会出现对应的ssh地址gitgithub.com:***。注意只有ssh地址能推送数据上去http不行但是可以通过 HTTP 克隆和获取仓库的内容。http换成https可能会导致pull失败Received HTTP code 400 from proxy after CONNECT3. 添加后远程库的名字就是origin这是Git默认的叫法也可以改成别的但是origin这个名字一看就知道是远程库。如果提示已经存在这个远程库名可以改成另一个名字。git变更项目地址git remote set-url origin git***.gitgit remote -v取消本地目录下关联的远程库git remote remove origin查看git提交和拉取对应的远程库$ git remote -vorigin git://github.com/***/***.git (fetch)origin git://github.com/***/***.git (push)提交代码到远程库git pushgit push aliasbranch 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 -lhNote: dev可以为任何分支名去掉--name-status则显示每个文件的具体变化加上则只显示有变化的文件。显示结果中D代表delete的文件A代表add的文件M代表modified的文件。从远程库拉取分支git pull查看所有远程分支git branch -rpull之前查看本地和远程的区别先更新下本地的远程分支git fetch origin然后可以比对git diff --name-only HEAD FETCH_HEADgit diff --name-only FETCH_HEAD HEAD^ #远程和本地上个版本区别Note:1 --name-only表示只显示修改的文件不显示改动具体内容。2 上一个版本就是HEAD^上上一个版本就是HEAD^^当然往上100个版本写100个^比较容易数不过来所以写成HEAD~100。git pull alias branch namegit pull origin dev也可以直接git pull直接拉取不指定分支。Note:1 不过不在master分支上时git pull远程代码到本地可能需要先设置一下远程和本地分支的对应$git branch --set-upstream-toorigin/dev devBranch 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 devgit pull merge规则git2.0以上的git pull规则好像是这样的如果远程的文件比本地新修改时间则会与本地合并生成标记的冲突来手动解决pull后直接输入命令git mergetool如果远程文件比本地旧则本地文件并不会改变仍和远程不一样。git pull实际是git fetch和git merge只是它把过程的细节都隐藏了起来以至于你不用去了解git中各种类型分支的区别和使用方法。bug fix1 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其它分支的提交devgit checkout -b devgit push -u origin devGit pull冲突处理[Git冲突解决]git子项目submodule开发过程中经常会有一些通用的部分希望抽取出来做成一个公共库来提供给别的工程来使用。为当前工程添加submodulegit submodule add 仓库地址 路径Note:1. 仓库地址是指子模块仓库地址路径指将子模块放置在当前工程下的路径。2. 路径不能以 / 结尾会造成修改不生效、不能是现有工程已有的目录不能順利 Clone命令执行完成会在当前工程根路径下生成一个名为“.gitmodules”的文件其中记录了子模块的信息。添加完成以后再将子模块所在的文件夹添加到工程中即可。或者通过这样来配置git submodule initgit config submodule.子目录/a.url http://gitlab.aaa.com/xrec/a.gitgit 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 gitgithub.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 Tokengithub授权 下载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.gitGit就会创建一个裸仓库裸仓库没有工作区因为服务器上的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 gitserver:/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/目前世界上最为流行的代码托管网站