Git&GitHub 学习1:Git学习(不断更新)

1、认识 Git 和 GitHub

Git 是个版本控制系统,说明白点就是进行代码的各类管理,好比你写错代码进行回滚、追寻 BUG 是哪一个家伙形成的、合并别人代码等等,从而达到协同进行软件开发工做。html

这里要提下:版本管理控制系统分为「集中式版本控制系统」和「分布式版本控制系统」,不少人可能用过 SVN,就是属于集中式版本控制系统,而 Git 属于分布式版本控制系统。关于二者区别自行搜索资料了解下。固然学习起来,Git 相对更难上手些。jquery

若是说准备学习 Git,我以为结合 GitHub 来学习是很好的。说到这,或许还有人不知道 GitHub 是什么,不要紧,我来解释下,简单讲就是一个开源社区网站(也被你们叫为「同性恋社区」,由于活跃着基本都是程序员呀,而这个群体基本又都是 ♂ 捂脸.jpg)。linux

GitHub 聚集了全球很是多的程序大牛,包括 Linux 之父 Linus(这是他的 GitHub地址),而且 Linux 系统的代码也是公开存放在这个网站(地址:github.com/torvalds/li…),任何人均可以查看整个源代码。对于这样一个社区网站,若是只是人人能够把代码开源在上面以让其余人能够阅读并学习这样的功能,这未免太单一了。实际,GitHub 网站有不少「好玩的」,包括容许用户追踪其余用户、组织、软件库的动态,对软件代码提出问题,发表评论等。ios

社群功能再多,但最重要的仍是版本控制,好比 A 同窗开源了某个项目代码,B、C 等同窗能够先 fork A 的代码到本身的帐户,再 clone,即下载下来进行阅读、修改。等修改了好代码,能够发起 Pull Request 提交 A,A 最后如果以为代码写的没任何问题,能够赞成 Pull Request 并进行代码合并。这样经过多人努力,这个项目代码将会愈来愈好。git

但整个过程一定离不开 Git 操做。虽然能够选择 Git GUI 客户端软件使用,但我仍是强烈建议一开始先学 Git 命令操做。学习 Git 命令操做能更好达到对 Git 的深层理解,以后能够考虑使用 Git GUI。程序员

这里补充下,对于如何为别人的开源的项目贡献代码?假设你是 B 同窗,其大体流程以下:github

  1. 先点击 A 同窗的项目仓库站点的 fork 的按钮,这样的你的 GitHub 帐户下也会有一个相同的仓库;
  2. 而后把这个 fork 过来的仓库代码 Clone 到本地,而后你就开始对该项目代码进行修改了,以为修改 OK 了,就能够 push 到你远程仓库(即你 GitHub 帐户下 fork 来的那个仓库),最后经过内建的“pull request”机制向项目负责人申请代码合并;
  3. A 要是以为你修改的代码没啥问题,就能够赞成 pull request 了,赞成以后,你的代码就合并到该项目了。这样你就是该项目的贡献者之一了。

说到这,估计仍是会存在部分人对 GitHub 以为很陌生。这里摘入网上一些文章和资料先了解和学习下吧:算法

系列文章: 从0开始学习 GitHub 系列 - stormzhang,推荐看完该系列文章。编程

如何建立项目:安全

关于 GitHub 网站:

2、Git 命令

2.1 认识 Git

简单讲讲个人认识:首先 Git 属于「分布式版本控制系统」,先要好好理解这个分布式与集中式的不一样。

集中式的如 SVN,是有一台中央服务器(其实就是某台电脑安装了 SVN 软件),全部开发人员从本身电脑(好比 Eclipse 下安装 SVN 插件)检出项目代码,任何一人修改了代码就能够提交至中央服务器,而后其余人检出(即更新、合并了代码),这样反复重复的过程,其中包括冲突的解决等,这全部的代码操做都记录在中央服务器 SVN 中的。从中能够看出这台中央服务器的做用和重要性吧,说一个很明显的问题:万一中央服务器宕机了,你就不能提交,也不能更新代码了。

分布式的如 Git,是每一个人本地维护一个版本控制管理信息,那怎么作到的呢?首先你本地须要安装 Git ,这个软件安装完毕,新建目录并在该目录下执行 git init 就会有一个 .git 隐藏文件夹及内容,这个文件夹下内容维护着该目录下的项目代码状况。但怎么就分布式呢?——大概是这样的,GitHub (其实就能够理解为某台电脑/服务器)上有别人提交上去的项目代码,而后你 Clone (克隆/下载)来,你本地这份项目代码就包含 .git 文件夹,里面就有这个项目代码的全部的版本信息,相似的,其余任何人也能够一样 Clone 下来,也是有这样一份这个项目代码的全部的版本信息,而后大家均可以基于本身 Clone 下来的项目代码进行代码的修改了,本地会记录你的修改、提交、回滚等等代码操做信息,就算 GitHub 网站挂了也没事,大家本地都有保持着这个项目代码的全部版本控制信息。 大概意思你们再体会下。

而后这里能够涉及到不少关于 Git 的操做,还有一些概念,好比分支。我简单说下分支,以某个 Android 项目为例,好比该项目有个主分支 master 是专门用来对外发布上线的代码,可是开发过程当中某个节点遇到某个 Bug 须要修复,则能够在此开发节点新建一个好比 hotfix 分支来进行代码的修复,修复好了再合并到主分支 master 上,而后能够删除掉 hotfix 分支。

能够看出 Git 命令是学习的重点,要学的深入,最好懂得原理和本质。本文仅是我的的学习记录,我把经常使用的命令整理和记录在此,方便之后查找。

2.2 操做本地库经常使用 Git 命令

一、git init

初始化一个目录,其实初始化完毕而后本地多出了一个 .git的隐藏目录,这个目录管理着一个代码库的版本信息。

二、git add

把一个文件从untracked(未被追踪)状态转为到 staged状态,直白的讲,就是把文件提交到暂缓区,这个时候还没真正意义上的代码提交。格式为:git add .提交全部改动,git add hello.txt提交指定文件的改动。

三、git commit

这步才是真正的代码提交到仓库,格式为:git commit或者加参数git commit -m “此次的提交说明信息”,前者会进入一个页面,输入 i 能够进入编辑界面,再写上此次的提交的注释说明信息(通常用来记录本次提交的主要意图),而后按 ESC 键退出编辑返回到命令模式,而后连续输入两个大写的 "Z"(用 Shift 键或 Capslock 键均可以),就保存并退出了;后者的话直接能够写上提交的注释说明信息。

若是在提交的时候出现提示设置邮箱和用户名,是为了保证提交的准确性,在提交的时候 user.name 和 user.email 会进入日志,这些信息,是追踪代码变动的关键,好比是谁修改的。之后会随更新内容一块儿被永久归入历史记录。

PS:在设置用户名的时候,可使用任意的字符。Git 其实是使用 email 进行关联每次提交的,只不过使用 username 做为标示符来进行显示。当你的 email 地址和 github上的 email 地址一致时,则会使用 Github 上面的 name 来进行显示。

若是工做中只涉及一个 git 服务器,用一个全局配置就能够了。

全局配置:

git config --global user.name "strivebo"
git config --global user.email "ishuzb@gmail.com"
复制代码

非全局配置,某个项目下的配置:(去掉--global)

git config user.name "strivebo"
git config user.email "ishuzb@gmail.com"
复制代码

可使用命令来查看修改后的配置:

git config --global user.name 或 git config user.name
git config --global user.email 或 git config user.email
复制代码

取消全局配置:

git config --global --unset user.name
git config --global --unset user.email

git config --global user.name    #(查看)全局配置帐户是否已经移除
git config --global user.email   #(查看)全局配置邮箱是否已经移除
复制代码

四、git reset --hard

版本回退操做,好比我想把当前的版本回退到上一个版本,要使用什么命令呢?可使用以下 2 种命令,第一种是:git reset --hard HEAD^。那么若是要回退到上上个版本只需把 HEAD^ 改为 HEAD^^ 以此类推。那若是要回退到前100个版本的话,使用上面的方法确定不方便,咱们可使用下面的简便命令操做:git reset --hard HEAD~100 便可。

假设: 我进行了两次修改,第一次 readme.txt 文件添加了 2222,第二次添加了 3333,我已经使用回退操做回到了第一次的修改,即如今文本内容为 2222,但我其实又想回到第二次的修改,该怎么办呢(如何恢复 3333 内容呢)?能够这样:

经过以下命令便可获取到版本号:git reflog,能够看到增长内容 3333 的版本号是多少好比为 6fcfc89,咱们如今能够命令:git reset --hard 6fcfc89 来恢复了。

五、git status

查看仓库文件状态。能够加参数 -s,即git status -s,加个 -s 用简洁模式查看当前修改和仓库里面差异多少,能够看到有多少文件被新增了,多少被修改了,多少被删除了。

六、git log

查看提交历史记录,即版本历史信息,好比谁提交的,什么时间啊。

七、git diff

能够显示工做目录和暂存区之间的不一样(不加选项参数)。换句话说,这条指令可让你看到「若是你如今把全部文件都 add,你会向暂存区中增长哪些内容」。好比git diff develop,查看当前版本和 develop 分支的差别。

八、git diff –cached

查看已经暂存起来的文件和上次提交的版本之间的差别。git diff –cached filename 查看已经暂存起来的某个文件和上次提交的版本之间的差别。

九、git diff --staged

使用 git diff --staged 能够显示暂存区和上一条提交之间的不一样。换句话说,这条指令可让你看到「若是你当即输入 git commit,你将会提交什么」。

十、git branch

查看有哪些分支,而且能看到当前处于哪一个分支上。注:初始化仓库后默认有 master 这个主分支,通常状况下不会轻易在该主分支操做。新建分支可使用git branch <newBranch>格式,如 git branch dev新建分支 dev,其内容和和主分支如出一辙。

十一、git branch -a:查看本地和远程全部分支

十二、git branch -r:查看远程全部分支

1三、git branch -v:查看远程分支详细信息

1四、git checkout a: 切换到 a 分支。

1五、git checkout -b a

有人就说了,我要先新建再切换,未免有点麻烦,有没有一步到位的,有的:git checkout -b a 表示新建分支 a 并同时切换到分支 a。

1六、git merge

合并分支代码,好比合并 dev 分代码,须要先切换到 master 分支,再git merge dev便可合并 dev 分支代码。

1七、git merge -- about

会尝试恢复到你运行合并前的状态。 但当运行命令前,在工做目录中有未储藏、未提交的修改时它不能完美处理,除此以外它都工做地很好。因为如今 Git 仓库处于冲突待解决的中间状态,因此若是你最终决定放弃此次 merge,也须要执行一次 merge --abort 来手动取消它。输入这行代码,你的 Git 仓库就会回到 merge 前的状态。

1八、git branch -d

删除分支。 假如这个分支新建错了,或者a分支的代码已经顺利合并到 master 分支来了,那么 a 分支没用了,须要删除,这个时候执行 git branch -d a 就能够把a分支删除了。

1九、git branch -D

强制删除。有些时候可能会删除失败,好比若是 a 分支的代码尚未合并到 master,你执行 git branch -d a 是删除不了的,它会智能的提示你 a 分支还有未合并的代码,可是若是你非要删除,那就执行 git branch -D a 就能够强制删除 a 分支。

20、git tag

新建标签。咱们在客户端开发的时候常常有版本的概念,好比 v1.0、v1.1 之类的,不一样的版本确定对应不一样的代码,因此我通常要给咱们的代码加上标签(即把某次提交标记为某个 tags,如 v1.0),这样假设 v1.1 版本出了一个新 bug,可是又不晓得 v1.0 是否是有这个 bug,有了标签就能够顺利切换到 v1.0 的代码,从新打个包测试了。因此若是想要新建一个标签很简单,好比 git tag v1.0 就表明我在当前代码状态下新建了一个 v1.0 的标签,输入 git tag 能够查看历史 tag 记录。 想要切换到某个 tag,执行:git checkout v1.0,就能够切换到 v1.0 的代码状态。

2一、git branch -vv

查看本地分支关联(跟踪)的远程分支之间的对应关系,本地分支对应哪一个远程分支。

2二、git push origin v0.1.2

表示将 v0.1.2 标签提交到 Git 服务器(一般的 git push 不会将标签对象提交到 Git 服务器,咱们须要进行该显式操做)。若是将本地全部标签一次性提交到 Git 服务器,能够 git push origin –tags

2二、合并屡次 commit,参考以下

git rebase -i HEAD~4  #能够看到最近 4 次的 commits,而后修改 commit 前面的为 squash,改完后保存,后继也会出现能够填写该次的 message
git add .
git rebase --continue 
git push -f 	# -f 强制推送到远程服务器
复制代码

2.3 操做远程库相关 Git 命令

一、git clone

远程 clone 即复制/克隆一个完整的 repository (仓库,即项目代码)到本地,克隆仓库时所使用的远程主机自动被 Git 命名为 origin,若是想用其余的主机名,须要用git clone命令的-o选项指定。格式为:git clone -o jQuery https://github.com/jquery/jquery.git,而后git remote命令查看,能够看到名字为远程主机名 jQuery。

这里要特别说下,这里克隆能够有两种方式,一种 https 方式,一种 ssh 。

①若是是 https 方式,复制仓库 https 地址进行 clone 操做,如:git clone https://github.com/strivebo/git-practice.git

这样克隆下来的项目仓库,注意观察.git文件夹下的config中的文件 url:

[remote "origin"]
	url = https://github.com/strivebo/git-practice.git
	fetch = +refs/heads/*:refs/remotes/origin/*
[branch "master"]
	remote = origin
	merge = refs/heads/master
复制代码

②若是是 ssh 方式,复制仓库的 ssh 地址进行 clone 操做,如:git clone git@github.com:strivebo/git-practice.git

这样克隆下来的项目仓库,注意观察.git文件夹下的config中的文件 url:

[remote "origin"]
	url = git@github.com:strivebo/git-practice.git
	fetch = +refs/heads/*:refs/remotes/origin/*
[branch "master"]
	remote = origin
	merge = refs/heads/master
复制代码

注1: 能够看到,https 方式下 url 为 「https 地址」,ssh 方式下 url 为「ssh 地址」(我就这么任性表达了,反正意思明白就行),因此假设你采用的 https 方式 clone 下来的项目能够经过修改这个 url 为「ssh 地址」,这样本地仓库就至关因而使用了 「ssh 方式 clone 下来的」。

**注2:**二者的区别有,若采用的 https 方式,则每次提交代码至 GitHub 时,都要求输入 GitHub 帐号和密码才能提交,若 ssh 方式,则不须要每次的输入。但固然这前提是你已经添加 ssh 。

关于 SSH 协议的历史,能够看看这篇文章:SSH 协议(Secure Shell 协议)

这里引用我看到的网上资料关于 https 和 SSH 的区别说下:

  1. 前者能够随意克隆 github上的项目,而无论是谁的;然后者则是你必须是你要克隆的项目的拥有者或管理员,且须要先添加 SSH key ,不然没法克隆。
  2. https url 在 push 的时候是须要验证用户名和密码的;而 SSH 在 push 的时候,是不须要输入用户名的,若是配置 SSH key 的时候设置了密码,则须要输入密码的,不然直接是不须要输入密码的。

关于如何添加 ssh 下面是步骤:

  1. Linux 与 Mac 都是默认安装了 SSH ,而 Windows 系统安装了 Git Bash(即安装了 Git 就有这个) 应该也是带了 SSH 的,在终端输入ssh命令能够查看是否安装了 ssh;

  2. 紧接着输入 ssh-keygen -t rsa 或者ssh-keygen -t rsa -C "注释"格式 ,就是指定 rsa 算法生成密钥,接着连续三个回车键(不须要输入密码)而后就会生成两个文件 id_rsa 和 id_rsa.pub ,而 id_rsa 是密钥,id_rsa.pub 就是公钥。这两文件默认分别在以下目录里生成: Linux/Mac 系统 在 ~/.ssh 下,win系统在 /c/Documents and Settings/username/.ssh 下, 都是隐藏目录,你们应该能找到的;

    注: 其实在连续安回车键中会提示输入一个密码以及确认密码,这个密码会在你提交项目时使用,若是为的话(即直接按回车键,也即未设置密码)提交项目代码时则不用输入密码;

  3. 接下来要作的是把 id_rsa.pub 的内容添加到 GitHub 上(PS:如何添加自行网上搜下,就很少说了),这样你本地的 id_rsa 密钥跟 GitHub 上的 id_rsa.pub 公钥进行配对,受权成功,这样就能够不用像 https 方式每次输入帐号和密码进行验证身份才能提交了。(你就理解为,SSH 就比如进行了身份验证的这种理解。)

  4. SSH key 添加成功以后,输入 ssh -T git@github.com 进行测试,若是出现如下提示,再输入 yes 出现以下图则证实添加成功了。(图我就不截了,我以为问题应该不大)

补充:对于命令 ssh-keygen添加不一样参数的含义—— ssh-keygen参数说明

二、git remote

列出全部的远程仓库。从别处 clone 来的,默认都会有一个别名”origin”的仓库。带上 -v 能够看到具体 URL。

三、git remote add

添加远程仓库地址。其实这些操做都是在本地,并无实际牵涉到远程。另外 github 里面fork 过来的,默认叫”upstream”。该命令完整格式为:git remote add <主机名> <网址>,如git remote add orgin git@github.com:strivebo/git-practice.git

四、git remote rw

删除远程仓库地址。格式为:git remote rm <主机名>

五、git remote rename

用于远程主机的更名。完整格式为:git remote rename <原主机名> <新主机名>

六、git fetch

一旦远程主机的版本库有了更新(Git 术语叫作 commit),须要将这些更新取回本地,这时就要用到git fetch命令。格式为:git fetch <远程主机名>,默认状况下,git fetch取回全部分支(branch)的更新。

  • 若是只想取回特定分支的更新,能够指定分支名,格式为:git fetch <远程主机名> <分支名>, 另外,所取回的更新,在本地主机上要用"远程主机名/分支名"的形式读取,好比origin主机的master,就要用origin/master读取。
  • 取回远程主机的更新之后,能够在它的基础上,使用git checkout命令建立一个新的分支,git checkout -b newBrach origin/master,该命令表示,在origin/master的基础上,建立一个新分支。此外,也可使用git merge命令或者git rebase命令,在本地分支上合并远程分支。

七、git pull

git pull命令的做用是,取回远程主机某个分支的更新,再与本地的指定分支合并。至关于 fetch后,再进行 merge。其完整格式为:git pull <远程主机名> <远程分支名>:<本地分支名>,如取回origin主机的next分支,与本地的master分支合并,能够这样写:git pull origin next:master

  • 若是远程分支是与当前分支合并,则冒号后面的部分能够省略,即git pull origin next,该命令表示,取回origin/next分支,再与当前分支合并。实质上,这等同于先作git fetch,再作git merge

在某些场合,Git会自动在本地分支与远程分支之间,创建一种追踪关系(tracking)。好比,git clone的时候,全部本地分支默认与远程主机的同名分支,创建追踪关系,也就是说,本地的master分支自动"追踪"origin/master分支。 Git也容许手动创建追踪关系。

  • git branch --set-upstream master origin/next该命令指定master分支追踪origin/next分支

  • 若是当前分支与远程分支存在追踪关系,git pull就能够省略远程分支名。git pull origin该命令表示,本地的当前分支自动与对应的origin主机"追踪分支"(remote-tracking branch)进行合并

  • 若是当前分支只有一个追踪分支,连远程主机名均可以省略,git pull该命令表示,当前分支自动与惟一一个追踪分支进行合并

  • 合并须要采用rebase模式,可使用--rebase选项。git pull --rebase <远程主机名> <远程分支名>:<本地分支名>

  • 若是远程主机删除了某个分支,默认状况下,git pull 不会在拉取远程分支的时候,删除对应的本地分支。这是为了防止,因为其余人操做了远程主机,致使git pull不知不觉删除了本地分支。可是,你能够改变这个行为,加上参数 -p 就会在本地删除远程已经删除的分支。git pull -p 该命令等同于:

    git fetch --prune origin 
    git fetch -p
    复制代码

八、git push

git push命令用于将本地分支的更新,推送到远程主机。它的格式与git pull命令相仿。其完整格式为:git push <远程主机名> <本地分支名>:<远程分支名>

  • 若是省略远程分支名,则表示将本地分支推送与之存在"追踪关系"的远程分支(一般二者同名),若是该远程分支不存在,则会被新建。git push origin master该命令表示,将本地的master分支推送到origin主机的master分支。若是后者不存在,则会被新建。
  • 若是省略本地分支名,则表示删除指定的远程分支,由于这等同于推送一个空的本地分支到远程分支。git push origin :master等同于git push origin --delete master该命令表示删除origin主机的master分支。
  • 若是当前分支与远程分支之间存在追踪关系,则本地分支和远程分支均可以省略。git push origin该命令表示,将当前分支推送到origin主机的对应分支。
  • 若是当前分支只有一个追踪分支,那么主机名均可以省略。git push
  • 若是当前分支与多个主机存在追踪关系,则可使用-u选项指定一个默认主机,这样后面就能够不加任何参数使用git pushgit push -u origin master该命令将本地的master分支推送到origin主机,同时指定origin为默认主机,后面就能够不加任何参数使用git push了。

注:不带任何参数的git push,默认只推送当前分支,这叫作 simple 方式。此外,还有一种matching 方式,会推送全部有对应的远程分支的本地分支。Git 2.0 版本以前,默认采用 matching 方法,如今改成默认采用 simple 方式。若是要修改这个设置,能够采用git config命令。

$ git config --global push.default matching
# 或者
$ git config --global push.default simple
复制代码

还有一种状况,就是无论是否存在对应的远程分支,将本地的全部分支都推送到远程主机,这时须要使用--all选项。

$ git push --all origin
复制代码

上面命令表示,将全部本地分支都推送到origin主机。

若是远程主机的版本比本地版本更新,推送时Git会报错,要求先在本地作git pull合并差别,而后再推送到远程主机。这时,若是你必定要推送,可使用--force选项。

git push --force origin
复制代码

上面命令使用--force选项,结果致使远程主机上更新的版本被覆盖。除非你很肯定要这样作,不然应该尽可能避免使用--force选项。

最后,git push不会推送标签(tag),除非使用--tags选项。git push origin --tags

九、删除远程分支:git push origin --delete <branchName>

不然,可使用这种语法,推送一个空分支到远程分支,其实就至关于删除远程分支:git push origin :<branchName>

十、删除 tag:git push origin --delete tag <tagname>

另外,这也是删除 tag 的方法,推送一个空 tag 到远程tag:git tag -d <tagname>git push origin :refs/tags/<tagname>

十一、修改还未 push 的注释:git commit --amend,修改后保存退出。刚刚 push 到远端尚未人其余人下载或改动的:

git commit --amend
复制代码

进入修改页面修改注释信息,修改后 :wq 保存退出。 再使用git push --force-with-lease origin master。若是其余人已经下载或改动:

git fetch origin
git reset --hard origin/master
复制代码

来源:git修改未push和已经push的注释信息

2.4 参考资料

3、实战学习

3.1 代码提交到 GitHub 上

1) 两种克隆 Clone 方式

一、采用 HTTPS 方式克隆 GitHub 上仓库(项目):git clone https://github.com/strivebo/git-practice.git

二、采用 SSH 方式克隆:git clone git@github.com:strivebo/git-practice.git

  • 若是想要在克隆至本地时指定别的目录名称,能够在后面加个参数,如:git clone https://github.com/strivebo/git-practice.git git-practice-another,手动指定本地仓库的根目录名称为 git-practice-another。

提下,GitHub 中的 SSH 和 HTTPS 提交区别:github中ssh和https提交的区别 | git使用ssh密钥和https两种认证方式汇总(转)

解释下:从 GitHub 上 Clone 一个项目到本地的时候,有 use https 和 use ssh 两种方式,这两种主要是在 push 项到 GitHub 上时有所不一样。完成一个 push 操做,须要对其内容进行安全管理,这里提供了 ssh 和 https 两种方式。而在 Clone 项目到本地时,作出选择后,就已经决定了 push 的方式。

SSH 使用了 RSA,即非对称加密的方式,存在一个公钥和私钥。能够生成一个本地的一组秘钥,而后将公钥复制到 GitHub 的 settings/profile 下。使用 https 方式,每次须要验证用户身份信息。

2) 采用 https 方式克隆

在使用 git status 命令查看仓库状态如果看到: your branch is ahead of 'origin/master' by 2 commits. ,解释下:

  1. Git 提示你的当前 branch 已经领先于( "ahead of" )'origin/master' 两个提交了
  2. origin/master 的中的 origin 是远端仓库的名称,是你在用 Clone 指令初始化本地仓库时 Git 自动帮你起的默认名称;master 是 origin 上的分支名称。

能够暂时把 origin/master 简单理解为「中央仓库」,也就是说,这句话是告诉你,你的本地仓库已经领先中央仓库两个提交了。而后可使用 git push 提交发布至中央服务器(这里即指 GitHub)。

由于采用的是 https 方式克隆,因此在这个过程 GitHub 会向你索要帐户和密码。填入正确的帐户和密码,push 操做就完成了。这时你再去你的 GitHub 仓库页面能够看到提交记录。说明你已经成功把本地仓库的提交推送到了服务器了。

PS:若是以为一遍遍地输入密码很烦,能够按照 这个页面 提供的方案来把密码保存起来。另外还有一个更简单但安全性低一些的方案。执行这行代码:git config credential.helper store,在这以后你只须要再输入一次密码, Git 就会把你的密码保存下来,这以后就不再用输入了。说它「安全性低」,是由于这条指令会让 Git 把你的密码以明文形式保存在你的电脑上。具体这两种保存密码的方案选择哪一个,看你本身了。

总结下:

  1. 从 GitHub 把中央仓库 Clone 到本地把写完的代码提交。即先使用命令:git clone,再用 git add 文件名 把文件添加到暂存区,再用 git commit 提交;
  2. 在这个过程当中,可使用 git status 来随时查看工做目录的状态。每一个文件有 "changed / unstaged"(已修改), "staged"(已修改并暂存), "commited"(已提交) 三种状态,以及一种特殊状态 "untracked"(未跟踪);
  3. 提交一次或屡次以后,把本地提交 push 到中央仓库(命令:git push)。

3) 采用 ssh 方式克隆

在拥有了一个 GitHub 帐号以后,就能够自由的 Clone 或者下载其余项目,也能够建立本身的项目,可是你无法提交代码。仔细想一想也知道,确定不可能随意就能提交代码的,若是随意能够提交代码,那么 GitHub 上的项目岂不乱了套了,因此提交代码以前必定是须要某种受权的,而 GitHub 上通常都是基于 SSH 受权的。那么什么是 SSH 呢? 简单点说,SSH 是一种网络协议,用于计算机之间的加密登陆。目前是每一台 Linux 电脑的标准配置。而大多数 Git 服务器都会选择使用 SSH 公钥来进行受权,因此想要在 GitHub 提交代码的第一步就是要先添加 SSH key 配置。

添加 SSH 步骤:

  1. Git Bash下输入 ssh 查看电脑是否安装了 ssh;
  2. 紧接着输入 ssh-keygen -t rsa,什么意思呢?就是指定 rsa 算法生成密钥,接着连续三个回 车键(不须要输入密码) ,而后就会生成两个文件 id_rsaid_rsa.pub ,而 id_rsa 是密钥,id_rsa.pub 就是公钥。这两文件默认分别在以下目录里生成: Linux/Mac 系统 在 ~/.ssh 下,Windows 系统在 /c/Documents and Settings/username/.ssh 下, 都是隐藏文件。
  3. 接下来要作的是把 id_rsa.pub 的内容添加到 GitHub 上,这样你本地的 id_rsa 密钥跟 GitHub 上的 id_rsa.pub 公钥进行配对,受权成功才能够提交代码。
  4. SSH key 添加成功以后,输入 ssh -T git@github.com 进行测试。

最后就是 push、pull 的操做了。添加 SSH key 成功以后,咱们就有权限向 GitHub 上咱们本身的项目提交代码了。执行:git push origin master 进行代码提交。

实践: 假设咱们本地有个 test2 的项目,咱们须要的是在 GitHub 上建一个 test 的项目,而后把本地 test2 上的全部代码 commit 记录提交到 GitHub 上的 test 项目。

  1. 第一步就是在 GitHub 上建一个 test 仓库,具体怎么操做我就很少说了吧;

  2. 第二步切换到 test2 目录,打开 Git Bash,把本地 test2 项目与 GitHub 上的 test 项目进行关联:git remote add origin git@github.com:strivebo/test.git

    什么意思呢?就是添加一个远程仓库,地址是 git@github.com:strivebo/test.git,而 origin 是给这个项目的远程仓库起的名字,是的,名字你能够随便取,只不过你们公认的只有一个远程仓库时名字就是 origin ,为何要给远程仓库取名字?由于咱们可能一个项目有多个远程仓库?好比 GitHub 一个,好比公司一个,这样的话提交到不一样的远程仓库就须要指定不一样的仓库名字了。

注:查看咱们当前项目有哪些远程仓库能够执行以下命令: git remote -v,接下来,咱们本地的仓库就能够向远程仓库进行代码提交了:git push origin master,就是默认向 GitHub 上的 test 仓库提交了代码,而这个代码是在 master 分支,固然你能够提交到指定的分支。

再次强调: Git 使用 https 协议,每次 pull,push 都要输入密码,至关的烦。使用 Git 协议,而后使用 ssh 密钥,这样能够省去每次都输密码。

4、问题和笔记

4.1 问题

1. fatal the current branch master has no upstream branch

对于前面这个「假设咱们本地有个 test2 的项目,咱们须要的是在 GitHub 上建一个 test 的项目,而后把本地 test2 上的全部代码 commit 记录提交到 GitHub 上的 test 项目。」实践练习有出现了问题,报错是:fatal the current branch master has no upstream branch.

参考网上资料:

个人总结:若是没有添加 ssh,没采用 ssh 方式克隆,那采用 https 方式克隆,如:git remote add origin https://github.com/strivebo/test.git,而后,下面是引用的网上一我的的解决方式:

此时若是 origin 的 master 分支上有一些本地没有的提交,push 会失败。因此解决的办法是,首先设定本地 master 的上游分支:git branch --set-upstream-to=origin/master,而后 pull:git pull --rebase,最后再 push:git push

2. 官网下载的 Git 与 TortoiseGit 客户端的关系?

Git 自带GUI界面。使用 git gui 命令能够打开它。在这个界面中能够完成 commit、merge、push、pull 等等经常使用操做。

.......

TortoiseGit 没有集成 Git。在 TortoiseGit 官方网站能够下载到它。有 32bit 和 64bit 版本,同时也有中文语言包(但我不建议你安装)。安装完毕以后,若是你没有安装过 Git,那么还须要去下载 msysGit 来安装。由于 TortoiseGit 其实只是一个壳,它须要调用 Git 命令行才能发挥做用。(如今你知道我为何推荐你用命令行了么?)

为何 TortoiseGit 不像 TortoiseSVN 同样,把 SVN 命令行工具集成在安装包中呢?我猜测是如下几点缘由:

  • Git 官方从未出过 Windows 版本二进制包;
  • msysGit 和 TortoiseGit 是两个不一样的团队开发的;
  • msysGit 和 TortoiseGit 的更新周期差别较大;
  • TortoiseGit 团队但愿安装包更小;
  • TortoiseGit 团队给用户更灵活的选择 Git 版本的权利。

来源:使用Git、Git GUI和TortoiseGit

3. Git 如何 Clone 非 master 分支代码

问题描述:在从 GitHub 上 Clone 项目下来的时候,如 https 方式克隆某个具备多个分支的项目:git clone https://github.com/TeamNewPipe/NewPipe.git

注:该分支默认分支为 dev 分支,其余分支有 master 、multyservice 分支。

出现的问题是:克隆完毕,使用 git branch 查看本地分支,只能看到 dev 分支。若是想要是查看或是说克隆非默认分支代码,如何操做呢?如下两种解决方式供参考:

①第一种:

新的解决方法:先 git branch -a 列出本地和远程全部分支,好比某个远程分支为 origin/daily/1.4.1,而后再直接使用 git checkout origin/daily/1.4.1

旧的解决方法:一、先在本地创建与远程分支同名分支名称;二、切换到该本地分支;三、创建上游分支,即 git branch --set-upstream-to=origin/daily/1.4.1 daily/1.4.1,这样完成与上游分支的关联,而后 pull 就行了。

参考:Git 如何 clone 非 master 分支的代码

②第二种:

Git 默认只显示默认分支的数据,须要手动切换到咱们须要的分支并显示出来。

git branch
git checkout -b <本地分支名字> origin/<远程分支名字>
复制代码

这样大功告成。

参考:克隆Github上项目的非Master分支

亲测第二种方式是能够的。

4. git pull 和 git fetch 有什么区别?

首先,你的每个操做都是要指明【来源】和【目标】的,而对于 pull 来讲,【目标】就是当前分支;

其次,你得清楚 Git 是有 tracking 的概念的,所谓 tracking 就是把【来源】和【目标】绑定在一块儿,节省一些操做是须要输入的参数。

那么,假设你的 master 和 develop 都是 tracking 了的,因而:

  • 当你在 master 下,git pull等于 fetch origin,而后 merge origin/master
  • 当你在 develop 下,git pull等于 fetch origin,而后 merge origin/develop

参考:git pull 和 git fetch 有什么区别?

4.2 笔记

1. 在本地仓库初始化后,不进行 commit 提交,则新建不了分支;进行了commit提交,则真正创建了 master 分支

在某些场合,Git 会自动在本地分支与远程分支之间,创建一种追踪关系(tracking)。好比,在 git clone 的时候,全部本地分支默认与远程主机的同名分支,创建追踪关系,也就是说,本地的 master分支自动"追踪" origin/master 分支。Git 也容许手动创建追踪关系:git branch --set-upstream master origin/next 该命令指定 master 分支追踪 origin/next 分支。

——来自阮一峰老师的 Git 文章。

2. 重命名本地和远程分支名称

在 Git 中重命名远程分支,其实就是先删除远程分支,而后重命名本地分支,再从新提交一个远程分支。

  1. 删除分支的命令是:在 Git1.7 以后可使用这个命令 git push origin --delete <远程分支名称>,不然用这个也能够:git push origin :<远程分支名称>表示推送一个空分支到远程分支,其实就至关于删除远程分支;
  2. 重命名本地分支:git branch -m <旧名称> <新名称>
  3. 从新提交:git push origin <新名称>:<新名称>

5、Git 图形化客户端 SourceTree

SourceTree 是 Windows 和 Mac OS X 下免费的 Git 和 Hg 客户端,拥有可视化界面,容易上手操做。同时它也是 Mercurial 和 Subversion 版本控制系统工具。支持建立、提交、clone、push、pull 和 merge 等操做。

SourceTree 官方下载:传送门

Sourcetree 可简化 Mercurial 和 Git 存储库的交互,让咱们集中精力编写代码。经过 Sourcetree 简单的 Git 图形用户界面查看和管理您的存储库。

  • 很是简单,适合初学者:告别命令行 - 经过 Git 客户端简化分发版本的控制,快速为每一个人提供最新信息。
  • 让专家如虎添翼:很是适合用于提升高级用户的工做效率。查看分支之间的变动集、stash、cherry-pick 等等。
  • 可视化代码:眼见真的为实。单击一次便可获取有关全部分支或提交的信息。
  • 桌面上的 Git 和 Hg:功能完善的图形用户界面,开箱即用,可提供高效、一致的开发流程。可与 Git 和 Mercurial 搭配使用。

网上的教程:

相关文章
相关标签/搜索