iOS开发 - git的使用(很详细)
前言
工作以来一直就使用SourceTree提高工作效率,那些原本熟悉的命令全部忘记干净了。
前些天由于突然断电,公司内部服务器硬盘故障,所以内部服务器上git仓库重建,我也趁机把git命令操作又熟悉了一遍,从此决定不到万不得已不再使用SourceTree操作了,一切操作都走git命令。
在这里把一些常用的和注意事项罗列出来供大家参考和自己记录。
强烈建议不熟悉git的朋友先熟悉命令,SourceTree只是提高效率的一种手段而已,原理还是要明白的好
。
目录
题主已经打算卸载SourceTree
,本文主要讲解git使用三个方面:
1.构建协作环境(将已有代码放到git仓库上面供别人分享,将别人放在git上面的代码clone下来)
2.git常用命令(包括:代码的增删改查等操作)
3.忽略文件.gitignore的配置
一、git从本地文件链接到远程仓库的方法(代码在本地,远程仓库为空)
公司项目协作是需要配置ssh key的,所有操作的前提是你已经配置了ssh key。
具体命令如下:
cd existing_folder //进入到工程文件夹
rm -rf .git //先清除.git文件
git init //再重置
git remote add origin xxxxxxxxx //链接到远程分支xxxxxxxxx(git上面的仓库地址)
git add . //暂存所有文件
commit之前设置下名字和邮箱 global为全局 local为本次
git config --global user.name "瓜皮"
git config --global user.email "aaa@qq.com"
git commit 需要输入注释说明
git commit -m 'description'
git push -u origin xxxx //最后push到xxxx分支
等待完成之后到sourceTree里面去从添加已存在的本地仓库
由于公司是重建的git工程,push的时候报了个错,这里记录一下(因为服务重建,.ssh下的known_hosts里面的hostkey改变了,所以vim编辑进入,删除以前的key即可)zjmdeMBP:zhujiamin PRO$ git push -u origin master
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@ WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED! @
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
IT IS POSSIBLE THAT SOMEONE IS DOING SOMETHING NASTY!
Someone could be eavesdropping on you right now (man-in-the-middle attack)!
It is also possible that a host key has just been changed.
The fingerprint for the ECDSA key sent by the remote host is
SHA256:2pWcmnQ4P38EUSSXNp89uG0um/K01bz/mWMJC3TMj2M.
Please contact your system administrator.
Add correct host key in /Users/a123/.ssh/known_hosts to get rid of this message.
Offending ECDSA key in /Users/a123/.ssh/known_hosts:3
ECDSA host key for git.yaomaitong.net has changed and you have requested strict checking.
Host key verification failed.
fatal: Could not read from remote repository.
Please make sure you have the correct access rights
and the repository exists.
二、git将远程仓库clone到本地的方法(代码在远程仓库,本地啥也没有)
mkdir iosProject //在当前目录创建一个空文件夹 (也可手动创建或者直接使用已有的文件夹)
cd iosProject //进入到你想要放置工程的空文件夹
rm -rf .git //先删除可能隐藏的git (个人习惯而已)
git clone xxxxxxxx //clone远程git仓库到本地
clone成功的样子:
zjmdeMacBook-Pro:restoreOldiOS PRO$ rm -rf .git
zjmdeMacBook-Pro:restoreOldiOS PRO$ git clone aaa@qq.com:xxx/ios.git
Cloning into 'ios'...
remote: Counting objects: 5611, done.
remote: Compressing objects: 100% (1914/1914), done.
remote: Total 5611 (delta 3657), reused 5611 (delta 3657)
Receiving objects: 100% (5611/5611), 107.30 MiB | 5.44 MiB/s, done.
Resolving deltas: 100% (3657/3657), done.
Checking connectivity... done.
clone成功之后应该在进入工程文件夹里面,本地创建几个远程必须的分支,主要用到的命令是:
git branch -a 查看所有分支
git checkout -b xxxx origin/xxxx //创建并切换到想要创建的本地分支
操作成功的样子:
zjmdeMacBook-Pro:restoreOldiOS PRO$ ls //远程文件夹为ios
ios
zjmdeMacBook-Pro:restoreOldiOS PRO$ cd ios //进入
zjmdeMacBook-Pro:ios PRO$ ls
Medicine MedicineTests Pods
Medicine.xcodeproj Podfile README.md
Medicine.xcworkspace Podfile.lock
zjmdeMacBook-Pro:ios PRO$ git branch //查看已有分支(只能看到已存在的分支)
* master
zjmdeMacBook-Pro:ios PRO$ git branch -a //查看所有分支,可以看到远程有好几个分支
* master
remotes/origin/HEAD -> origin/master
remotes/origin/develop
remotes/origin/feature_newLogin
remotes/origin/master
zjmdeMacBook-Pro:ios PRO$ git checkout -b develop origin/develop //挑选本地需要的分支进行创建
Branch develop set up to track remote branch develop from origin.
Switched to a new branch 'develop'
zjmdeMacBook-Pro:ios PRO$ git checkout -b feature_newLogin origin/feature_newLogin
Branch feature_newLogin set up to track remote branch feature_newLogin from origin.
Switched to a new branch 'feature_newLogin'
zjmdeMacBook-Pro:ios PRO$ git status
On branch feature_newLogin
Your branch is up-to-date with 'origin/feature_newLogin'.
nothing to commit, working directory clean
三、git常用命令
1.分支操作
git status 查看当前所在分支和更改内容
git branch 查看所有分支
git branch xxx 新建某分支
git checkout xxx 切换到某分支
git checkout -b xxx 创建并切换到某分支
git pull origin xxx 拉取xxx分支
git push origin xxx 推送同步xxx分支
git merge xxx 合并分支 (一般需要先切换到目的分支,然后merge想要merge的分支)
2.提交修改
git status //查看改动
git add xxx.m //暂存xxx.m文件
git add . //暂存所有改动
git rm xxx //删除xxx文件
git commit -m '修改了xx功能' //添加注释
git push origin xxxx //push 注意当前所在网络是否允许push
git commit --mend 修改最近一次提交的代码(这里会进入vim编辑器去修改)
3.查看某个文件的修改历史
git log --pretty=oneline 文件名 //需要进入该文件所在的文件夹
这里必须要进入到.h/.m文件所在的文件夹下,并且只能看到每次commit产生的hash码
例如:
zjmdeMBP:pinyin PRO$ git log --pretty=oneline ChineseString.h
f9f280d0df7907af97f8c88be58e9eb14cabdc93 去除无效的代码
7146065685ccc243bf9ca24ce67de0bf4277f7bc 完善工程
db2d150806a8583fa006e105c4461f977507d341 first
想要看到详细情形还需要使用 git show <hash码> 才能看到该次commit所做的修改内容及Author 和 Date;
4.撤销改动
a.修改最近一次commit的内容
git commit --amend 或 git commit --amend -m '注释信息'
b.commit前发现某个文件没有必要改动,我们需要让该文件回到未改动的状态
git checkout -- <filename>
c.本地已经执行提交操作,但是还没有push,想要撤销某文件的更改git reset <文件名> //缺省文件名时默认取消上次提交的所有内容,提交的内容回到未暂存状态
git reset --hard <文件名> //缺省文件名时默认取消上次提交的所有内容,并且修改的内容也全部重置
5.回滚代码到某次提交的节点
git log --oneline //查看所有的commit历史,显示每次commit生成的hash码的前七位和注释信息,例如:
zjmdeMBP:ios PRO$ git log --oneline
a674e9f AFN更新至3.1.0
345db82 消息闪退try..catch;
fb33370 更新cocoaPods及第三方库;
01931f7 忘记密码布局位置调整;
08ce469 增加友盟计数事件;
git revert xxxx //xxxx为某次commit的hash码,例如我想回滚到AFN更新前,命令如下:git revert a674e9f
执行之后进入vim编辑,填写注释后保存退出,然后add、commit、push就完成回滚了。
题主执行这一操作的时候,恰好电脑内存满了。。。所有报了下面这个错,记录一下
".git/COMMIT_EDITMSG" E509: Cannot create backup file (add ! to override)
编辑完回滚信息wq居然一直提示这个错误退不出去,一查发现是因为电脑内存满了,清理一些内容之后就OK了。
四、.gitignore的创建和使用
正常情况下我们并不需要将工程里面的所有内容都提交到git远程仓库,并且有些信息(比如那些每次编译都会变化的信息)会时常出现在UnCommitted changes里面,如下图:
所以我们需要一个.gitignore来帮助我们过滤这些不必要的信息;
事实上为了节省服务器空间,一些项目也会过滤掉pods管理的第三方库,只上传Podfile相关信息,下面的代码没有过滤pod文件,各位看官按需自己添加。
1.写在.gitignore里面的代码:
# Xcode
#
# gitignore contributors: remember to update Global/Xcode.gitignore, Objective-C.gitignore & Swift.gitignore
## Build generated
build/
DerivedData
## Various settings
*.pbxuser
!default.pbxuser
*.mode1v3
!default.mode1v3
*.mode2v3
!default.mode2v3
*.perspectivev3
!default.perspectivev3
xcuserdata
## Other
*.xccheckout
*.moved-aside
*.xcuserstate
2.创建.gitignore文件
我所知道的两种创建方法如下:
方法a:
cd existing_folder //进入到工程文件夹
touch .gitignore //创建一个.gitignore的文件
vim .gitignore //使用vim编辑器编辑.gitignore文件(也可以使用方法b后半部分的方法去编辑)
方法b:
当你用文本编辑器去编辑一个文件后保存为.gitignore的时候,系统会告诉你"Names that begin with a dot “.” are reserved for the system. If you decide to go ahead and use a name which begins with a dot the file will be hidden."因为以.开头的文件为系统保留,一定要创建的话该文件将会被隐藏。
于是我们可以用文本编辑器将忽略文件的代码写好后保存到项目工程目录下并命名为.gitignore文件(忽略系统提示),虽然它默认被系统隐藏,但是将你的工程文件夹拉入一个文本编辑器, 如下图所示, 本文示例使用的Sublime Text, 依然能够看到并编辑的!
如果你已经将一些本该忽略的文件提交到git服务器, 那么配置好.gitignore之后会发现之前总是出现的用户信息依然出现在Uncommitted changes中, 原因是因为.ignore是后来加进来的local cache里面记录的这个文件是不忽略的, 所以需要进行缓存清除, 这个时候你只需要将进入该工程目录下, 执行删除缓存中的文件后提交即可:
注意缓存路径就是出现在Uncommitted changes中的文件路径, 请确认路径正确。
$ git rm --cached 你的工程名.xcodeproj/project.xcworkspace/xcuserdata/你的电脑名.xcuserdatad/UserInterfaceState.xcuserstate
$ git commit -m '注释信息'
$ git push origin 分支名