Git命令

2016-10-12  本文已影响130人  CharlyZheng

挺全的参考 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命令。通过我的分析,在这个更直接地分析这两个命令的含义。


创建配置 .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(绿字变红字)

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。但是这样做会让你丢失回退点之后的历史。从你的需求来看,我这有个折中的方法:

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

上一篇下一篇

猜你喜欢

热点阅读