git tutorial

最近老板要搞retreat 需要做一个分享,正好把分享的内容作为博客记录一下。

说起git,那就不得不提GitHub。

GitHub 最开始是作为一个面向开源以及私有项目的管理平台。它可以存储代码,文档,数据等等。目前最常用将其作为一个代码仓库进行使用。

Repository  :每个项目我们会创建一个Repository,将所需要的所有文件上传至这个Repository中。

我们可以在GitHub网页上直接对Repository进行操作包括创建,上传代码,删除等等。但是对于没有图形界面的系统我们便没有办法进行这些操作。此外对于大型项目来说利用网页操作多有不便。

配置git

安装后git ,我们需要配置一下GitHub账户,将我们的用户名和账号写入到git的配置文件中

git config --global user.name [username] 
git config --global user.email [useremail]

创建本地 SSH 通道

SSH 是目前较可靠,专门为远程登录会话和其他网络服务提供安全性的加密通信协议。GitHub 支持使用 SSH 协议与本地进行通信。

在终端中输入一下指令来构建本地的 SSH 通道:

ssh-keygen -t rsa -C [useremail]

选择默认配置,配置完成。

 保存的密钥文件的地址在会在屏幕上输出,默认是  \.ssh\id_rsa.pub

配置本地到 Github 的 SSH 信道

你需要将本地的 SSH 公钥添加到 Github,来实现加密传输。本地的 SSH 公钥默认位置为:\.ssh\id_rsa.pub

复制 id_rsa.pub 中的所有文件内容到 Github -> Settings -> SSH and GPG keys,添加 New SSH Key,粘贴当前的公钥。

然后在本地终端中输入以下指令测试连通性:

ssh -T git@github.com

如果有 warning,就输入 yes 并回车。

创建仓库

仓库的创建分为两种情况

从本地文件夹创建仓库

在项目所在的文件夹输入命令

git init

从远程仓库创建仓库

git clone [github repository ssh link]

本地库修改

在这里插入图片描述

添加文件

将修改的文件提交至暂存区

git add [the file name]

我们可以利用git add 添加文件,命令后面添加指定的文件名字

如果想要添加所有文件夹内有变化的文件,可以使用命令

git add .

更加便捷,但是需要注意的是将所有文件添加,可能会添加一些没有必要上传的工程带来的过程文件

提交文件

将暂存区里的改动提交到本地的版本库。每次使用 git commit 命令我们都会在本地版本库生成一个 40 位的哈希值,这个哈希值也叫 commit-id。

git commit -m “message”提交到版本库,并指定提交信息。

git commit -a -m “message”

git commit -am “message”

-a 参数表示,可以将所有已跟踪文件中的执行修改或删除操作的文件都提交到本地仓库,即使它们没有经过 git add 添加到暂存区。
git commit --amend追加提交,它可以在不增加一个新的 commit-id 的情况下将新修改的代码追加到前一次的 commit-id 中。

删除文件

1.git rm 会删除工作区中的文件;

2.git rm 会同时将删除的文件添加到暂存区;
【因此 git rm 相当于 rm + git add 两个命令】
【注意】 git rm 删除的文件必须是 没有经过修改的,也就是说必须要和当前版本库的内容一致的。

3.git commit 后,版本库中的此文件记录也会被删除。

4.提交到版本库,完成删除动作       git commit -m “xxxxxx”

查看提交状态

git status命令用于显示工作目录和暂存区的状态。使用此命令能看到那些修改被暂存到了, 哪些没有, 哪些文件没有被Git tracked到。git status不显示已经commit到项目历史中去的信息。

git status 简单的展示状态信息。输出的内容分为3个分类/组。

第一部分是通过运行git commit来提交的; 第二个和第三部分是你可以通过在运行git commit之前运行git add来提交的。

# On branch master
# Changes to be committed:  (已经在stage区, 等待添加到HEAD中的文件)
# (use "git reset HEAD <file>..." to unstage)
#
#modified: hello.py
#
# Changes not staged for commit: (有修改, 但是没有被添加到stage区的文件)
# (use "git add <file>..." to update what will be committed)
# (use "git checkout -- <file>..." to discard changes in working directory)
#
#modified: main.py
#
# Untracked files:(没有tracked过的文件, 即从没有add过的文件)
# (use "git add <file>..." to include in what will be committed)
#
#hello.pyc

分支

分支操作允许创建另一路线/方向上开发。我们可以使用这个操作将开发过程分为两个不同的方向。 例如,我们发布了1.0版本的产品,可能需要创建一个分支,以便将2.0功能的开发与1.0版本中错误修复分开。

创建分支

新建一个分支,但不切换

git branch [branch name]

切换分支

使用git checkout命令在分支之间切换

git checkout [branch name]

创建和切换分支

Git为checkout命令提供-b选项; 此操作将创建一个新的分支,并立即切换到新分支。

git checkout -b [branch name]

查看分支

1.git branch查看本地所有分支

2.git branch -r查看远程所有分支

3.git branch -a查看本地和远程所有分支

如图,本地分支前带有“*”号且为绿色,远程分支为红色

重命名分支

git checkout -m [old branch name] [new branch name]

删除分支

可以通过向git branch命令提供-D选项来删除分支。 但在删除现有分支之前,请切换到其他分支。

git branch -D [branch name]

远程交互

提交至远程

git push命令用于将本地分支的更新,推送到远程主机

git push [远程主机名] [本地分支名]:[远程分支名]

当命令行不指定使用<repository>参数推送的位置时,将查询当前分支的branch.*.remote配置以确定要在哪里推送。 如果配置丢失,则默认为origin

示例

git push origin master

上面命令表示,将本地的master分支推送到origin主机的master分支。如果master不存在,则会被新建。

git push origin

上面命令表示,将当前分支推送到origin主机的对应分支。如果当前分支只有一个追踪分支,那么主机名都可以省略。

如果当前分支与多个主机存在追踪关系,则可以使用-u选项指定一个默认主机,这样后面就可以不加任何参数使用git push

git push -u origin master

上面命令将本地的master分支推送到origin主机,同时指定origin为默认主机,后面就可以不加任何参数使用git push了。

git push origin lbranch-1:refs/rbranch-1

推送本地分支lbranch-1到远程分支rbranch-1

删除远程分支

如果省略本地分支名,则表示删除指定的远程分支,因为这等同于推送一个空的本地分支到远程分支。

git push origin :master
# 等同于
git push origin --delete master

上面命令表示删除origin主机的master分支。

覆盖远程分支

用本地分支lbranch-2覆盖远程分支rbranch-1

git push -f origin lbranch-2:refs/rbranch-1

或者 -

git push origin :refs/rbranch-1   //删除远程的rbranch-1分支
git push origin lbranch-2:refs/rbranch-1

git pull从远程获取

git pull命令用于从另一个存储库或本地分支获取并集成(整合)。git pull命令的作用是:取回远程主机某个分支的更新,再与本地的指定分支合并。

将远程存储库中的更改合并到当前分支中。在默认模式下,git pullgit fetch后跟git merge FETCH_HEAD的缩写。

更准确地说,git pull使用给定的参数运行git fetch,并调用git merge将检索到的分支头合并到当前分支中。 使用--rebase,它运行git rebase而不是git merge

git pull [远程主机名] [远程分支名]:[本地分支名]

比如,要取回origin主机的next分支,与本地的master分支合并,需要写成下面这样 -

git pull origin next:master

如果远程分支(next)要与当前分支合并,则冒号后面的部分可以省略。上面命令可以简写为:

git pull origin next

上面命令表示,取回origin/next分支,再与当前分支合并。实质上,这等同于先做git fetch,再执行git merge

git fetch origin
git merge origin/next

在某些场合,Git会自动在本地分支与远程分支之间,建立一种追踪关系(tracking)。比如,在git clone的时候,所有本地分支默认与远程主机的同名分支,建立追踪关系,也就是说,本地的master分支自动”追踪”origin/master分支。

Git也允许手动建立追踪关系。

git branch --set-upstream master origin/next

上面命令指定master分支追踪origin/next分支。

git fetch + git merge git rebase 从远程获取

git fetch

从一个或多个其他存储库中获取分支和/或标签(统称为“引用”)以及完成其历史所必需的对象。 远程跟踪分支已更新(Git术语叫做commit),需要将这些更新取回本地,这时就要用到git fetch命令。 

git fetch

缺点:会拉取当前项目的所有分支的commit

git fetch origin

手动指定了要fetch的remote

git fetch origin branch1

设定当前分支的 FETCH_HEAD' 为远程服务器的branch1分支`.注意: 在这种情况下, 不会在本地创建本地远程分支.

这个命令可以用来测试远程主机的远程分支branch1是否存在, 如果存在, 返回0, 如果不存在, 返回128, 抛出一个异常.

git fetch origin branch1:branch2

使用远程branch1分支在本地创建branch2(但不会切换到该分支)
如果本地不存在branch2分支, 则会自动创建一个新的branch2分支,
如果本地存在branch2分支, 并且是`fast forward', 则自动合并两个分支, 否则, 会阻止以上操作.

git merge

将来自命名提交的更改(从其历史从当前分支转移到当前分支之后)。 该命令由git pull用于合并来自另一个存储库的更改,可以手动使用将更改从一个分支合并到另一个分支。

git rebase

假设你现在基于远程分支”origin“,创建一个叫”mywork“的分支。

但是与此同时,有些人也在”origin“分支上做了一些修改并且做了提交了,这就意味着”origin“和”mywork“这两个分支各自”前进”了,它们之间”分叉”了。 如图所示

 在这里,你可以用”pull“命令把”origin“分支上的修改拉下来并且和你的修改合并; 结果看起来就像一个新的”合并的提交”(merge commit):

 如果你想让”mywork“分支历史看起来像没有经过任何合并一样,也可以用 git rebase,如下所示:

git checkout mywork
git rebase origin

这些命令会把你的”mywork“分支里的每个提交(commit)取消掉,并且把它们临时 保存为补丁(patch)(这些补丁放到”.git/rebase“目录中),然后把”mywork“分支更新 到最新的”origin“分支,最后把保存的这些补丁应用到”mywork“分支上。
 

 当’mywork‘分支更新之后,它会指向这些新创建的提交(commit),而那些老的提交会被丢弃。 如果运行垃圾收集命令(pruning garbage collection), 这些被丢弃的提交就会删除.

rebase的过程中,也许会出现冲突(conflict)。在这种情况,Git会停止rebase并会让你去解决冲突;在解决完冲突后,用”git add“命令去更新这些内容的索引(index), 然后,你无需执行 git commit,只要执行:

git rebase --continue

这样git会继续应用(apply)余下的补丁。

在任何时候,可以用--abort参数来终止rebase的操作,并且”mywork“ 分支会回到rebase开始前的状态。

git rebase --abort

git 记录

git diff

git diff命令用于显示提交和工作树等之间的更改。此命令比较的是工作目录中当前文件和暂存区域快照之间的差异,也就是修改之后还没有暂存起来的变化内容。 

具体示例参考这篇博客git diff 比较文件的差异http://t.csdn.cn/lHMVi

git log

 git log命令用于显示提交日志信息。

.根据提交ID查询日志

git log commit_id    #查询ID(如:6bab70a08afdbf3f7faffaff9f5252a2e4e2d552)之前的记录,包含commit
git log commit1_id commit2_id #查询commit1与commit2之间的记录,包括commit1和commit2
git log commit1_id..commit2_id #同上,但是不包括commit1

将显示最近三次的提交。

git log -3


我能想到常用的命令合集就放在这里,后续可能会有一些补充

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值