Git命令

挺全的参考 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 .gitignorermdir .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需要知道,我们的源可以是本地的路径

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 159,716评论 4 364
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,558评论 1 294
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 109,431评论 0 244
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,127评论 0 209
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,511评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,692评论 1 222
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,915评论 2 313
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,664评论 0 202
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,412评论 1 246
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,616评论 2 245
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,105评论 1 260
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,424评论 2 254
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,098评论 3 238
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,096评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,869评论 0 197
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,748评论 2 276
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,641评论 2 271

推荐阅读更多精彩内容