最近老板要搞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 中。 |
查看提交状态
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 pull是git 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 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 比较文件的差异具体示例参考这篇博客
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
我能想到常用的命令合集就放在这里,后续可能会有一些补充