Git命令
Your branch is ahead of 'origin/master' by 1 commit.
表明你的本地库,比远程仓多了一个提交(产生了新的commit)
比较分支信息的话:
git log yourBranchName
或者本地和远程端的:
git fetch origin
git diff master origin/master 比较本地和远程主分支的区别
git status是查看你本地仓的信息的
工作区和版本库 合并远程分枝
git add 命令添加所有改动内容
git add xx
命令可以将xx文件添加到暂存区,如果有很多改动可以通过git add -A .
来一次添加所有改变的文件。注意-A选项后面还有一个句点.
git add -A
表示添加所有内容,
git add .
表示添加新文件和编辑过的文件不包括删除的文件;
git add -u
表示添加编辑或者删除的文件,不包括新添加的文件。
192:FarmHouse_IOS Lemon$ git add git add -A.
error: unknown switch `.'
usage: git add [<options>] [--] <pathspec>...
-n, --dry-run dry run
-v, --verbose be verbose
-i, --interactive interactive picking
-p, --patch select hunks interactively
-e, --edit edit current diff and apply
-f, --force allow adding otherwise ignored files
-u, --update update tracked files
-N, --intent-to-add record only the fact that the path will be added later
-A, --all add changes from all tracked and untracked files
--ignore-removal ignore paths removed in the working tree (same as --no-all)
--refresh don't add, only refresh the index
--ignore-errors just skip files which cannot be added because of errors
--ignore-missing check if - even missing - files are ignored in dry run
--refresh don't add, only refresh the index
--ignore-errors just skip files which cannot be added because of errors
--ignore-missing check if - even missing - files are ignored in dry run
git push
下面local_branch_name用来指明要推送本地哪个分支,remote_branch_name用来指明远端接收这个分支后叫什么。
git push origin [local_branch_name]:<remote_branch_name>
- 严格按照此格式写命令,否则可能会出现其他的状况
git checkout --file 同 git reset HEAD --file
首先需要知道工作区(working diretory)和暂存区(Stage)这两个概念。工作区的该概念不仅包含你实际操作、更改的文件还应当包括当前修改但未add存入暂存区的文件变化信息,暂存区的作用则是临时存储文件的变化信息,在git add file操作之后,暂存区中将记录file文件上的修改信息。暂存区的存在更细化了时间节点,要知道commit的往往是有重大改变的版本或者是在一次修改工作整体完成之后才使用commit。而在这之间需要保存的修改,自然需要一个缓存区暂时存放。廖雪峰的git教程中在“撤销修改”部分中,提到了几种情景和相应的git checkout与git reset命令。通过我的分析,在这个更直接地分析这两个命令的含义。
- git checkout -- file;撤销对工作区修改;这个命令是以最新的存储时间节点(add和commit)为参照,覆盖工作区对应文件file;这个命令改变的是工作区
- git reset HEAD -- file;清空add命令向暂存区提交的关于file文件的修改(Ustage);这个命令仅改变暂存区,并不改变工作区,这意味着在无任何其他操作的情况下,该命令运行之后工作区中的实际文件同之前无任何变化
创建配置 .gitignore
每次项目提交都会有每隔几秒xcuserstate的改变,而这个文件是不需要提交的 ,所以需要添加.gitignore对这个文件进行忽略
在当前目录下 git mkdir .gitignore
Vim & Vi 编辑使用
# Xcode
#
build/
*.pbxuser
!default.pbxuser
*.mode1v3
!default.mode1v3
*.mode2v3
!default.mode2v3
*.perspectivev3
!default.perspectivev3
xcuserdata
*.xccheckout
*.moved-aside
DerivedData
*.hmap
*.ipa
*.xcuserstate
# CocoaPods
#
# We recommend against adding the Pods directory to your .gitignore. However
# you should judge for yourself, the pros and cons are mentioned at:
# http://guides.cocoapods.org/using/using-cocoapods.html#should-i-ignore-the-pods-directory-in-source-control
#
# Pods/
保存之后,你会发现这个文件并未生效
原因是.ignore是后来加进来的 local cache里面记录的这个文件是不忽略的 所以需要进行缓存清除
git rm -r -cache 命令
从版本库中删除文件,但不删除文件
$ git rm --cached iLedger.xcodeproj/project.xcworkspace/xcuserdata/mac.xcuserdatad/UserInterfaceState.xcuserstate
$ git commit -m "Removed the stupid strange file that shouldn't be tracked"
$ git push
不跟踪设置成功后 git status
Untracked files 每次都显示,看着好别扭啊,但是没有找到处理的办法,心塞!!!
另外一点很奇怪的是 .gitignore 文件建错了地方,无论是 rm .gitignore
,rmdir .gitignore
都删除不了。最后根据提示先把 .gitignore
清空再执行rmdir .gitignore
才算搞定,世界终于清静了
gitHub clone 到本地指定文件夹
#测试连接 github
ssh -T git@github.com
#执行克隆 git clone xxx.git "指定目录"
git clone git@github.com:LemonChao/NoteBook.git "/Users/zhengchao/Documents/gitRepo"
git add
-
git add -A
stages All -
git add .
stages new and modified, without deleted -
git add -u
stages modified and deleted, without new
撤销git add(绿字变红字)
git reset HEAD . //撤销所有的已经add的文件:
git reset HEAD filename //撤销某个文件或文件夹:
git checkout -- 文件 //红字变无 (撤销没add修改,慎用)
同步远程分支
1.git clone
2.git pull origin branchname
git fetch 远程分支
打算把github上的一个分支取到本地,直接输入命令:
Git checkout origin/A
看到http://stackoverflow.com/questions/5989592/git-cannot-checkout-branch-error-pathspec-did-not-match-any-files-kn,
有了如下方法:
先执行git fetch, 从github上取回新的信息放到本地仓库中,比如哦我要取的那个分支在本地并没有这个信息,执行git branch -a 发现并没有那个分支,执行git fetch后就有了,
然后执行
git checkout -b A origin/A
就把远程的A取回,并切换到本地的A分支。
不过,貌似下面这条命令就可以完成取服务器上的信息,并且创建分支A,把服务器上的分支A取回的操作:
git checkout -t -b A origin/A
`git fetch origin dev` 从服务器更新dev分支
比较本地分支版本和远程版本的不同之处
假定远端库名为 origin(如果没有手动修改的话默认就是origin), 你要比较的本地分支为 test, 远端分支为 xxx
# 获取远端库最新信息
$ git fetch origin
# 做diff
$ git diff test origin/xxx
CocoaPods 升级后 push
失败解决
场景:升级完CocoaPods后第一次push
时让输入github账号密码(异常现象的开始),之后
fatal: unable to access 'https://github.com/CocoaPods/Specs.git/':The requested URL returned error: 403
一看git的远程地址被pod弄混了,
$ git remote -v
# 结果 小样果不其然
origin https://github.com/CocoaPods/Specs.git (fetch)
origin https://github.com/CocoaPods/Specs.git (push)
那就换回来呗
$ git remote set-url origin xxxx(#你的库的地址)
@结束
Git diff ^M的消除
这是由于换行符在不同的操作系统上定义的区别造成的。
Windows用CR LF来定义换行,Linux用LF。CR全称是Carriage Return ,或者表示为\r, 意思是回车。 LF全称是Line Feed,它才是真正意义上的换行表示符。为什么Windows添加一个CR和LF组合表示,我并不清楚。不过如果用git diff的时候看到^M字符,就说明两个文件在换行符上有所差别。
比如从我的Windows开发的同时那边拿来一个目录,就会发现几乎所有的文件都被修改过了。其实并不是这样,都是由于文件多了CR后造成的。
下面简单的方法可以让git diff的时候忽略换行符的差异:
git config --global core.whitespace cr-at-eol
更好的方法是每个项目都有一个.gitattributes文件,里面配好了换行符的设置,参考
https://help.github.com/articles/dealing-with-line-endings
Git diff
直接使用Git diff 可以产看当前没有add 的内容修改
查看已经add 没有commit 的改动 使用 git diff --cached
git diff HEAD 是上面两条的合并
git diff 版本号码1 版本号码2 src : 比较两个版本号码的src 文件夹的差异
回到git的某个历史版本,修改然后commit、push到服务器上成为最新的版本
需求:只退回到某个历史版本修改然后commit、push到服务器上成为最新的版本。
已经push到远程的提交是不能修改的。也就是说不能单独抽出某个提交进行修改。若一定要修改的话需要git push -f。但是这样做会让你丢失回退点之后的历史。从你的需求来看,我这有个折中的方法:
- 1 先获得服务器上最新的代码并在本地建立对应的分支:git clone ... ,git checkout -b <branch> <remote>/<branch>
- 2 把要返回历史提交以及之后所有提交 commit ID顺序的记录下来。
- 3 把该分支返回到历史上某个点: git reset SHA --hard
- 4 进行文件修改并且对返回点的提交进行修改: Modify , git add , git commit --amend
- 5 用之前记录下来的commit ID反向cherry pick,目标提交之后有多少提交都要拿过来: git cherry-pick SHA
- 6 对当前分支进行push,替换到服务器上的远程分支(需要强制push): git push -f <branch>:<branch>
git无法pull仓库refusing to merge unrelated histories
我在Github新建一个仓库,写了License,然后把本地一个写了很久仓库上传。
先pull,因为两个仓库不同,发现refusing to merge unrelated histories
,无法pull
因为他们是两个不同的项目,要把两个不同的项目合并,git需要添加一句代码,在git pull,这句代码是在git 2.9.2版本发生的,最新的版本需要添加--allow-unrelated-histories
假如我们的源是origin,分支是master,那么我们 需要这样写git pull origin master --allow-unrelated-histories
需要知道,我们的源可以是本地的路径