Git操作

git用于管理代码的不同版本,能够很快恢复到过去时间段的某个状态。同时在多人合作共同开发中,对于代码的修改与发送,都非常的轻快便捷,不同像在QQ群之间相互传代码的zip压缩包那样麻烦;不会疑惑其他人对代码做了哪些修改。Github/Gitee是运用互联网的思维,将代码存储在上面,通过互联网,我们才能够相互将代码分享。

而对于如何使用git来管理代码,这还需要熟悉一些原理与git命令操作,这样才会得心应手。

Git功能

  • Tracking multiple files together
  • Tracking change
  • Tracking history version (tracking 跟踪)

本机离线操作

在自己的电脑上管理代码local,其中涉及到三个空间概念: working directory存储在硬盘上的普通文件,staging area与add有关和repository与commit有关

concept map

git -version

查看git的版本

git log

查看提交的日志,其中那一串数字是commitID指向每个历史版本,按照时间从现在往之前推。q退出。

git log --graph --oneline

查看分支合并情况,类似图形界面

也可查看专门的分支

git log --graph --oneline master  分支名称

git diff

git diff commitID(之前) commitID(之后)

比较在repository中两个版本的不同,如取3aa08b92180bea3f594340f87d0d51e4a99edd87d07738fb19f551ea8d767f9fde6c4b702d0923ef进行比较,通过颜色或(-,+)等信息观察变化,可以只输入前面四个字符即可

image.png

表示新添了内容,该内容是新信息

git diff

场景: 该文件已经通过add加入到了staging area但是未加入到repository,而此时你去处理别的事情了(比如上厕所),回来的时候你想知道staging area的文件是否是最新的文件,因为你可能忘了,将该文件加入staging area后你是否又修改了该文件。

比较的是同文件在working area与staging area的状态

git diff --staged

比较的是staging area与repository中最新的”快照”

git checkout

git checkout master

回到主分支

git checkout 分支名称

该分支可以是本地的分支,也可以是远程的分支

切换到该分支

git checkout commitID

access old versions of files.可以回到这个commitID指向的当时版本。使用它,我们可以查看bug在那一次提交引入的。

git init

将一个文件夹初始化为一个 git repository(git 仓库)

git status

查看当前的文件状态,是否是添加到repository中还是在staging area状态

git add

将文件加入到staging area准备提交到本地的repository

git add .   表示将全部文件添加到staging area中
git add 文件名  只将该文件加入

git commit

A commit is a snapshot of git repository(快照)
提交commit会记录打log日志中,为了日后方便通过日志来跟踪代码的更改,应该遵循的原则是:

It‘s make one commit per logical change and give each commit a good message.(每跟换一次逻辑,进行一次提交)

git commit直接回车会打开sublime编辑器,进行更加详细的信息编辑(前提是需要配置sublime)

也可以使用git commit -m "message"在命令行快速写入信息

配置sublime

切换到Home目录下

cd ~

在Home路径下创建.bash_profile文件,在文件中添加,sublime的安装路径,注意转义

alias subl="C:/Program\ Files/Sublime\ Text\ 3/sublime_text.exe"

以后就可以在bash下使用subl 文件名来打开文件进行编辑

git branch

git branch

查看当前有哪些分支

git branch 分支名称

创建该分支

为什么创建分支

比如开发一个游戏正版的难度是3星,但是你觉得太难,于是想改代码实现一个2星级别的,但是正式版本是3星,你能让正式版本变成2星,于是你需要在这个基础上开一个分支,在该分支上你可以自己改写代码而不用影响主支master的代码。换而言之,你可以在分支上干自己想干的事,大胆的更改代码,而不用担心影响主分支master

git branch -d 分支名称

删除分支

git merge

合并分支,将两个分支上的代码,合并整合到一个分支上,其中不可避免的时conflict(冲突)

git merge branch1 branch2

将分支branch2合并到branch1
相当于 git checkout branch1 然后 git merge branch2

git merge --abort

取消合并

冲突问题

当冲突发生时,查看发生冲突的文件,这时候两个分支都是对原来的状态进行了修改,需要打开文件进行改写。如:

打开subl hello.txt文件,处理冲突:

<<<<<<< HEAD     表示HEAD指向的当前分支,此时为: different-oil
different information.




||||||| merged common ancestors   表示原始的内容,此时表示原来是空的



=======
master money
>>>>>>> master            表示master分支改动的地方

以上信息表示,master与different-oil都对原来的hello.txt状态进行了内容的增添,所以我们处理成这样,将两个分支添加的内容都添加进来。

different information.

master money
git show commitID

因为两个分支合并后,commit的时间是交错的,要想查看这个commit的快照与在合并之前的分支上的前一个commit快照的对比,这个命令可以做到。

compare a commit to its parent

Fast-forward-Merges

merging into is an ancestor of the branch that you're merging from

Github与本地local

Concept Map

SSH Key

Gitee(码云)、Github同时配置ssh key

在 ~/.ssh目录下
$ ssh-keygen -t rsa -C "[email protected]" -f "github_id_rsa"
$ ssh-keygen -t rsa -C "[email protected]" -f "gitee_id_rsa"
ssh -T [email protected]
ssh -T [email protected]

git remote

git remote

显示本地仓库与远程Github仓库上的连接

git remote -v 显示详细信息 v指verbose

git remote add origin git@...

将自己本地仓库与github仓库关联起来。(在github上新建一个repository最好勾选上README.md这样会产生第一次提交,然后在本地仓库执行该命令)注意与git clone的区别

关联之后就可以使用 git push origin mastergit push origin 分支 往github上提交文件了。(前提是要分配好SSH Key密钥) 其中origin代表远程

git remote add

git clone git@...

将github上的仓库克隆下来,作为本地的仓库。

git pull

当远程的Github仓库的内容改变时。
拉取Github上的代码与本地仓库的代码进行合并。

如果仓库只有自己一个人使用,那么在线上即Github上更改了某个文件,此时就需要git pull origin master远程的代码下来,进行合并,解决冲突。更常见的情况是,多人向一个仓库贡献代码,此时在你就需要pull远程,在本地解决冲突后,在pull request到贡献的仓库。

git pull origin master 相当于 依次执行了 git fetch origingit merge master origin/master

fork

这是在github通过fork其他人的仓库,将该仓库复制到自己github上的仓库中。

fork & clone & branch之间的区别

pull request

这个是在github上操作的,表示向fork的项目贡献代码。如: 在自己本地仓库(clone的fork的那个仓库)中创建了一个分支,在该分支上我们进行代码修改,然后将分支提交到我们fork的到自己github的仓库,然后在自己的github上的这个仓库上进行pull request.

当我们进行pull request后,fork的原来的项目的主人会受到信息,然后查看你pull request过去的版本是否符合要求,然后决定是否合并到他的项目master中。

pull request冲突

如:
1) 在自己的分支上修改,pull request到fork的原生项目时,发现有冲突
2) 在自己本地仓库中切换到master主分支,然后git pull拉取远程fork的仓库的master,因为我们修改代码都是在其他分支上,master主分支与远程的master合并时是Fast-forward merges,一般不会有冲突。

git pull 远程fork的SSH地址

或者

git remote add upstream 远程fork的SSH地址       //这个只执行一次就好
git pull upstream master                //以后再拉取远程fork仓库的代码时,就执行这个即可

3)将master更新git push orgin master到自己github的仓库
4)切换到分支,与master进行合并,解决冲突,在提交到自己的仓库,进行pull request

各个空间的改变

Courses

  • Udacity: how to use git and github

  • Version Control with Git

Problem

git pull

Problem-1

fatal: refusing to merge unrelated histories

Solved

git pull origin master --allow-unrelated-histories

Problem-2

There is no tracking information for the current branch.
    Please specify which branch you want to merge with.
    See git-pull(1) for details

    git pull  

If you wish to set tracking information for this branch you can do so with:

    git branch --set-upstream develop origin/

Solved

git pull origin master

你可能感兴趣的:(Git操作)