#git的使用

git是一款免费、开源的分布式版本控制系统,用于敏捷高效地处理任何或小或大的项目。Git是一个开源的分布式版本控制系统,用以有效、高速的 处理从很小到非常大的项目版本管理。 Git 是 Linus Torvalds 为了帮助管理 Linux 内核开发而开发的一个开放源码的版本控制软件。这里附上一个不错的学习git的网站 git 使用手册

一、配置git环境

1.打开终端, 直接输入, 先检查系统是否已经存在SSH key

1
cat ~/.ssh/id_rsa.pub然后回车

2.不存在的话 创建一个新的SSH key, 这里一般使用的都是邮箱, 比如你的gitHub的邮箱呀什么的。

1
ssh-keygen -t rsa -C"your_email@youremail.com"

这里输入的过程中可能提示输入一个类似于密码的自定义的通行证号,如果直接回车则为空, 可能也会要你输入将要保存的路径,直接回车默认为当前路径。

3.创建成功之后, 在执行命令1拿到SSH key, 复制一下

Alt text
Alt text

如图一长串的东西就是SSH Key

一定要记得复制的时候包括ssh-rsa

4.将SSH key输入到GitHub网站中(以将远程仓库建立在gitHub中为例)

Alt text
Alt text

如图设置一个标题, 然后把之前复制的一串东西粘贴进去就是了
5.测试是否能够正确链接到github中,输入以下命令:

1
ssh -T git@github.com

将会显示一下信息

1
The authenticity of host 'github.com (207.97.227.239)' can't be established. RSA key fingerprint is 16:27:ac:a5:76:28:2d:36:63:1b:56:4d:eb:df:a6:48. Are you sure you want to continue connecting (yes/no)?

输入yes后,显示出下列信息表示连接成功

1
Hi username! You've successfully authenticated, but GitHub does not provide shell access.

二、配置git个人信息

1.设置用户名和邮箱
//配置名字

1
git config --global user.name"Firstname Lastname"

//配置邮箱

1
git config --global user.email"your_email@youremail.com"

//配置完以后检查配置是否正确

1
git config -l(这个是小写的L)

Git通过检测用户名和邮箱来跟踪进行commit的用户, 所以需要配置一下, 以区分不同用户的提交信息, 一般都是多人开发嘛

三、新建一个git仓库的方法

1.使用xcode自带的方法创建

Alt text
Alt text

打开Xcode,创建一个新的工程

Alt text
Alt text

选择下一步,在项目名中输入你要创建的项目的名字

Alt text
Alt text

点击下一步,也就是最后一个步骤,在这里先选择一个要保持工程的目录,然后在窗口底部选上Create git repository on (My Mac )
2.手动创建一个分支的方法

  • cd 你要创建的文件夹路径
  • git init
    Alt text
    Alt text
    你会看到文件夹下有这样一个文件
    到这里你就完成了一个git仓库的建立。

四、将git仓库推送到远程

1、添加远程服务器

1
git remote add origin git@github.com:gbyukg/zf-tutorial.git

2、将你的项目文件夹直接拖到SourceTree里面

Alt text
Alt text

图中GitDemo所示

3、直接在图形化界面里面操作就是了, 第一步可以直接push, 将工程文件推送到服务器上面。

五、Xcode中的显示

既然说到git主要用在代码的版本控制上, 那肯定与开发工具有着紧密的联系, 下面就来看一下, xcode上与git是怎么联系的

Alt text
Alt text

常用的操作选项就是上面标出的地方。

Alt text
Alt text

这里是去掉(回退)git操作记录的选项。

六、git常用命令

虽然有SourceTree这样好用的图形化界面工具, 但是有些操作是它无法完成的, 或者说在上面操作容易出错的。下面介绍一下git操作常用的命令。

远程仓库相关命令

1. 克隆一份代码到本地

1
cd 放置工程文件夹的目录
1
git clone 代码的服务器的链接

克隆到本地之后, 以后就不用每次都用cd定位文件夹了, 可以直接在SourceTree上定位到当前仓库(SourceTree右上角的Terminal选项)

2. 查看远程仓库

1
git remote -v

3. 添加远程仓库

1
2
git remote add origin [url]
//此处的origin可以换成其他的任意名字, 即创建的远程仓库的名字, 下面的操作都要以这个名字为准

4. 删除远程仓库

1
git remote rm origin

5. 拉取远程仓库

1
git pull origin [localBranchName]

6. 推送远程仓库

1
git push origin [localBranchName]
github push错误:403 Forbidden
1
2
error: The requested URL returned error: 403 Forbidden while accessing https://github.com/wangz/future.git/info/refs
git version 1.7.1

解决方案:

1
2
//cd到仓库下
vim .git/config

修改

1
2
3
4
5
[remote "origin"]
url = https://github.com/wangz/example.git
为:
[remote "origin"]
url = https://wangz@github.com/wangz/example.git

再次git push,弹出框输入密码,即可提交

7. 添加某台电脑上的某个文件夹当做远程服务器

1
git remote add 电脑名字+电脑ip+电脑上的某个文件

使用这个命令是为了给当前仓库添加一个远程服务器, 所以, 你首先必须有一个本地的仓库。

Alt text
Alt text

结果如下

Alt text
Alt text

分支(branch)操作相关命令

1. 查看本地分支

1
git branch

2. 查看远程分支

1
git branch -r

3. 创建本地分支

1
git branch [name] ----注意新分支创建后不会自动切换为当前分支

4. 切换分支

1
git checkout [name]

5. 创建新分支并立即切换到新分支

1
git checkout -b [name]

6. 删除分支

1
git branch -d [name] ---- -d选项只能删除已经参与了合并的分支,对于未有合并的分支是无法删除的。如果想强制删除一个分支,可以使用-D选项

7. 合并分支

1
git merge [name] ----将名称为[name]的分支与当前分支合并

8. 创建远程分支(本地分支push到远程)

1
git push origin [name]

9. 删除远程分支

方式一:

1
2
git push origin :[name]
//如果省略 [本地分支],那就等于是在说“在这里提取空白然后把它变成[远程分支]”,也就是删除了远程分支

方式二:

1
git push origin -d [name]

ignore文件操作

查看忽略文件

1
cat .gitignore

修改忽略文件

1
2
3
4
5
6
7
vi .gitignore
这个指令是以只读的形式打开文件的,这个时候按键盘上的大部分按键都是无效的.如果想编写文件,需要下面的指令.
//编写文件
开始编写的指令有两个,实现的效果是一样的.直接按键盘上的i或者a,这两个指令的作用都是让编辑器进入对文件的编辑状态
//保存退出
在编辑状态按Esc键,会回到打开文件的状态,这个时候输入:wq(就是write And quite的意思)就会保存并退出Vi编辑器.

1.对已经提交过的文件执行ignore

如果出现已经 commit 过的文件无法被忽略,那么需要执行:

1
2
git rm <FILENAME>
如果执行失败,则可能需要强制移除,执行git rm -r -f <FILENAME>

之后提交推送,此后 .gitignore 才会对此文件生效。原因是 .gitignore 只会对没有被 git 记录过的文件生效,也就是 untracked file。

2.对未commit的文件执行ignore

直接执行上面的修改忽略文件就可以。

回退代码相关操作

1. 回退代码到某个版本, 保留吐出的代码

1
git reset 1b30859

2. 回退代码到某个版本, 不保留吐出的代码

1
git reset --hard 1b30859

3. 回滚之前提交的某个点, 生成一个新的提交点

1
git revert 1b30859

如果这个点是之前merge的点,Git会抱怨:

1
is a merge but no -m option was given

这是因为你revert的那个commit是一个merge commit,它有两个parent, Git不知道base是选哪个parent,就没法diff,所以就抱怨了,所以你要显示告诉Git用哪一个parent

一般来说,如果你在mastermerge develop,那么parent 1就是masterparent 2就是develop.

所以你需要执行这样的revert命令:

1
2
//如果你现在在master上, 它的意思就是将这个点从master上回退掉
git revert 1b30859 -m 1

此时使用下面命令可以详细查看相应的父分支的点:

1
2
git show 1b30859
//Merge: 312a518 fa87415 //312a518和fa87415 可以在git log中找到对应的提交信息

revert点g的前后效果图:

1
2
3
a -> b -> c -> f -- g -> h (master)
\ /
d -> e (dev)

1
2
3
a -> b -> c -> f -- g -> h -> G (master)
\ /
d -> e (dev)

其中G 是撤销 g 生成的 commit。通过 git show G 之后,我们会发现 G 是一个常规提交,内容就是撤销 merge 时被丢弃的那条线索的所有commit 的「反操作」的合集。

4. 取消某次merge的内容

1
git merge --abort

分支编辑

1. 如果当前分支既有未从远程pull下来的代码, 又有本地已经commit的代码, 即分支上出现一上一下箭头, 采用如下命令

1
git rebase origin/develop

rebase的原理相当于三步:

1. 将我们的分支退回到上次和服务器同步时的状态  即 reset
2. 将reset之后的代码Stash一份
3. 与服务器进行同步,同步之后再将原来的Stash的代码吐出来和与服务器同步之后的代码进行合并

这样就不会造成下面的出现拐角的分支(也就是说我们在进行push的时候发现服务器里面有新代码,这时候不要执行pull命令。而是执行rebase命令则会将分支成一条直线)

2. 想在某条分支上移动某个分支

1
2
3
A---B---C topic
/
D---E---F---G develop

例如有一条分支develop,topic是从develop上拉出来的分支,这时候我想把topic分支从E点移动到F点,那要怎么操作呢?

  1. 第一步:先将分支切到F点,暂且叫做temp分支。
  2. 使用命令git rebase temp topic.此时topic分支会被移动到F点,且分支已被切换到topic分支,但是此时topic分支可能显示不正常有上下箭头,这是因为切换的这个topic分支已经不是原来的topic分支了,git创建了一个全新的分支并命名为topic,所以此时需要把远程的topic分支删掉,然后将本地的topic分支push到远程,则万事大吉了。

执行之后会得到如下的结果:

1
2
3
A---B---C topic
/
D---E---F---G develop

NOTE
git-rebase - Reapply commits on top of another base tip

3. 想将某条分支上拉出的分支移动到另一个分支的某个点

1
2
3
4
5
H---I---J topicB
/
E---F---G topicA
/
A---B---C---D develop

例如有一条分支develop,从develop上拉出了一条分支topicA,从topicA分支上拉出了一条分支topicB,此时如果我想将topicB分支移动到develop上的C点怎么操作呢?

  1. 第一步:先将分支切到C点,暂且叫做temp分支。
  2. 使用命令git rebase --onto temp topicA topicB
    意思就是将目前存在于topicA上的分支topicB移动到temp分支上,也就是移动到develop分支上的C点。
  3. 合并过程中如果有冲突则会立马停止,这时候要去解决冲突,解决完冲突之后使用命令rebase --continue继续分支分编辑操作。

注意
一定要注意,如果分支像下面这样,

1
2
3
4
5
H---I---J topicB
/ \
E---F---G---K---L---M---N---O---P topicA
/
A---B---C---D develop

此时想要将topicB分支移动到develop上的C点,就不能直接那么干了,不然你会发现坑大了,如果你还是按上面的操作,你会发现分支变成了下面这样:

1
2
3
4
5
E---F---G---K---L---M---N---O---P topicA
/
A---B---C---D develop
\
H---I---J---M---N---O---P topicB

为什么会这样呢?
推测:git rebase --onto temp topicA topicB这个命令可能是把topicA从topicB分支上的起始点开始到终点(露头的点),也就是包含topicB上的几个点。

NOTE
对于想要使用git rebase --onto temp topicA topicB该命令一定是露头的分支,不能是起始点在某个分支上,同时该分支也被merge到了该分支上。如果是这样的就需要先把该分支已经merge的点退掉,将需要迁移的分支漏出来,再进行编辑。(怀疑如果是merge到了其他分支上应该是没问题的,这个没试过,暂不确定)

参考
git-rebase - Reapply commits on top of another base tip

其他操作

1. 想要对之前已经进行过git ignore操作的文件再次添加进git管理中, 执行如下操作

1
git add 文件路径 -f

2. 强制push某个点到远程

1
git push --force origin develop

此命令小心使用

3. 第一次将从某个分支拉出来的分支合到这个分支上的时候, 容易出现拉成直线的情况, 这时候要执行下面的操作

1
git merge --no-ff -m "货基转股基_4.90.01" 货基转股基_4.90.01

这句命令的意思就是:(假设目前在develop分支上) 这是第一次merge, 我想要把 货基转股基_4.90.01 分支merge到develop分支上。 --no-ff参数,表示禁用Fast forward, 因为本次合并要创建一个新的commit,所以加上-m参数,把commit描述写进去。

这里还有一种简单的方法, 直接在界面操作

Alt text
Alt text

第一次merge的时候只要打上这个勾勾就可以了。

4. 删除本地SourceTree中远程分支目录里面已经被删除的分支

1
git fetch -p

它的意思就是在fetch之后删除掉没有与远程分支对应的本地分支。

5. 重命名远程分支

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

6. 从Git仓库中恢复已删除的分支或丢失的commit

使用这条命令的前提是你曾经将这个点提交过或者push过

7. 关于vim窗口的使用

开始用git commit 提交的时候是用 -m “message”的

后来直接用git commit 回车后弹出一个窗口,后来才知道是linux下的文本编辑器

郁闷的是半天退出不出来,baidu,google一番,

进入之后是VIM的普通模式,按 i 键,进入INSERT模式,这是可以输入message了。

输入完成之后,按ESC键进入命令模式 ,输入冒号(在窗口下面显示),然后输入x,回车就OK了。

8. 解决github push错误The requested URL returned error: 403 Forbidden while accessing

cd到你的代码路径下

1
vim .Git/config

修改

1
2
[remote "origin"]
url = https://github.com/wangxiusen/wangxiusen.github.io.git


1
2
[remote "origin"]
url = https://wangxiusen@github.com/wangxiusen/wangxiusen.github.io.git

然后ESC :wq保存退出。
再次git push,弹出框输入密码,即可提交。

七、git命令合集

一张酷图帮你收集齐所有git命令

Alt text
Alt text