初始化配置
|
|
查看、添加、提交、删除、找回,重置修改文件
|
|
查看文件diff
|
|
查看提交记录
|
|
tig
Mac上可以使用tig代替diff和log,brew install tig
取得Git仓库
|
|
提交你的修改
|
|
查看、切换、创建和删除分支
|
|
分支合并和rebase
|
|
Git补丁管理(方便在多台机器上开发同步时用)
|
|
Git暂存管理
|
|
Git远程分支管理
|
|
基本的分支管理
|
|
Git远程仓库管理
|
|
创建远程仓库
|
|
也可以命令设置跟踪远程库和本地库
|
|
Git查看并修改name和email
显示name的方法:
|
|
或者查看~/.gitconfig文件。
改名字:
或者直接修改当前仓库的.git/config文件。
Git 忽略一些文件不加入版本控制
在git中如果想忽略掉某个文件,不让这个文件提交到版本库中,可以使用修改 .gitignore 文件的方法。这个文件每一行保存了一个匹配的规则例如:
|
|
另外 git 提供了一个全局的 .gitignore,你可以在你的用户目录下创建 ~/.gitignoreglobal 文件,
以同样的规则来划定哪些文件是不需要版本控制的。
需要执行
git config --global core.excludesfile ~/.gitignoreglobal
来使得它生效。
其他的一些过滤条件
|
|
由于git不会加入空目录,所以下面做法会导致tmp目录不会存在
tmp/* //忽略tmp文件夹所有文件
改下方法,在tmp下也加一个.gitignore,内容为
还有一种情况,就是已经commit了,再加入gitignore是无效的,所以需要删除下缓存
注意: .gitignore只能忽略那些原来没有被track的文件,如果某些文件已经被纳入了版本管理中,则修改.gitignore是无效的。
正确的做法是在每个clone下来的仓库中手动设置不要检查特定文件的更改情况。
|
|
另外 git 还提供了另一种 exclude 的方式来做同样的事情,不同的是 .gitignore 这个文件本身会提交到版本库中去。
用来保存的是公共的需要排除的文件。而 .git/info/exclude 这里设置的则是你自己本地需要排除的文件。
他不会影响到其他人。也不会提交到版本库中去。
.gitignore 还有个有意思的小功能, 一个空的 .gitignore 文件 可以当作是一个 placeholder 。
当你需要为项目创建一个空的 log 目录时, 这就变的很有用。 你可以创建一个 log 目录 在里面放置一个空的 .gitignore 文件。
这样当你 clone 这个 repo 的时候 git 会自动的创建好一个空的 log 目录了。
Github协同流程
fork给自己 → clone到本地 → coding → push回自己 → github上提出Pull Request即可
之后,本地添加fork源为远端源 → 工作前先pull下fork源保持代码较新 → coding → …
Git放弃本地更改恢复到资源库版本
使用git版本控制工具在本地clone一份代码后,如果发现修改错误想恢复到资源库版本,下面两行可以轻松加愉快的搞定:
git clean -xdf
git checkout -f
GitHub更新fork的版本实践
前提
你已经在github上fork了别人的分支,并且弄好了跟github的ssh连接。(如果没有ssh连接可使用HTTP,操作的时候会多一个输入用户名密码操作)
相关配置详情参考:https://help.github.com
详细操作:
1.检出自己在github上fork别人的分支
git clone git@github.com:comtu/android-training-course-in-chinese.git
2.然后增加远程分支(也就是你fork那个人的分支)名为atcic(这个名字任意)到你本地。
git remote add atcic git@github.com:kesenhoo/android-training-course-in-chinese.git
如果你运行命令:git remote -v你会发现多出来了一个Bob的远程分支。如下:
atcic git@github.com:kesenhoo/android-training-course-in-chinese.git (fetch)
atcic git@github.com:kesenhoo/android-training-course-in-chinese.git (push)
origin git@github.com:comtu/android-training-course-in-chinese.git (fetch)
origin git@github.com:comtu/android-training-course-in-chinese.git (push)
3.然后,把对方的代码拉到你本地。
git fetch atcic
4.最后,合并对方的代码。
git merge atcic/master
5.最最后,把最新的代码推送到你的github上。
git push origin master
这样就完成了自己的代码更新。
回滚到历史版本
reset方式回滚
查看历史版本号
git log
回滚到某个版本 可取前七位数
#假设有一个版本号: 9c759cc2354430d2a24a4ec7100470fe11db219agit reset --hard 9c759cc
强推送到服务器
git push -f origin master
reset 会影响 commit 9c759cc 之后的commit都会被退回到暂存区
建议只是自己控制的版本可以这样使用,多人协同控制的建议如下方式.
revert方式回滚
revert 是提交一个新的版本,将需要revert的版本的内容再反向修改回去,版本会递增,不影响之前提交的内容
回滚
git revert HEAD
#撤销前一次 commitgit revert HEAD^
#撤销前前一次 commit git revert HEAD^^^git revert commit 9c759cc
#撤销指定的版本,撤销也会作为一次提交进行保存。提交
git push origin master
#提交到master分支
技巧一 提交防止织毛衣,有序地合并和提交.
可以在一条分支上一起开发,你有变更的时候,在提交前,使用
git stash
这样将本地的修改全部缓存在一个堆栈中了把别人的修改同步过来
git pull --rebase
将自己的变更恢复到最新的节点上
git stash pop
git commit
提交,这样就会让一个分支的版本按顺序继续发展,而不是像织毛衣一样
技巧二 在分支上协同合作开发.不织毛衣.
git支持很多种工作流程,我们采用的一般是这样,远程创建一个主分支,本地每人创建功能分支,日常工作流程如下:
去自己的工作分支
$ git checkout work
工作
....
提交工作分支的修改
$ git commit -a
回到主分支
$ git checkout master
获取远程最新的修改,此时不会产生冲突
$ git pull
回到工作分支
$ git checkout work
用rebase合并主干的修改,如果有冲突在此时解决
$ git rebase master
回到主分支
$ git checkout master
合并工作分支的修改,此时不会产生冲突。
$ git merge work
提交到远程主干
$ git push
这样做的好处是,远程主干上的历史永远是线性的。
每个人在本地分支解决冲突,不会在主干上产生冲突。也就不会出现织毛衣了.
技巧三 合并不同分支内容到当前分支
cherry-pick
就是从不同的分支中捡出一个单独的commit,并把它和你当前的分支合并。
使用: git cherry-pick 分支节点ID
如: git cherry-pick b21fd14
如果你以并行方式在处理两个或以上分支,你可能会发现一个在全部分支中都有的bug。
如果你在一个分支中解决了它,你可以使用cherry-pick命令把它commit到其它分支上去,而不会弄乱其他的文件或commit。
但应该意识到这个命令可能会产生冲突。所以用它时请务必小心。
使用中遇到的问题
Git – fatal: Unable to create ‘XXX/.git/index.lock’: File exists.的解决办法
- 1 若在window下远程打开操作窗口(不是console),进入.git目录删除index.lock文件,删除后再commit会自动再次生成index.lock。无法提交。
- 2 使用putty console下操作,进入.git目录执行 rm -f index.lock 删除index.lock 虽然能删除,但是也是每次都会再生成。无法提交
- 3 在.git同级目录,执行rm -f .git/index.lock(或者rm -f git/index.lock) 删除后可提交。成功!
Git 删除远程仓库文件或文件夹
使用 git rm 命令即可,有两种选择.
- 一种是 git rm –cached “文件路径”,不删除物理文件,仅将该文件从缓存中删除;
- 一种是 git rm –f “文件路径”,不仅将该文件从缓存中删除,还会将物理文件删除(不会回收到垃圾桶)
假如你有文件不小心commit到了服务器那么你想要删除它,可以使用:
|
|
若用git status
命令查看,则node_modules/目录下文件出现在结果列表里, 我们不希望这个目录下的文件出现,则在项目根目录下,和.git 同级目录下,新建一个.gitignore文件,
把.gitignore提交到远程服务器。 则node_modules目录就不会被提交了。
IDEA中分支切换error: The following untracked working tree files would be overwritten by checkout
在IDEA中进行分支切换时,出现如此错误,导致无法正常切换:
error: The following untracked working tree files would be overwritten by checkout
通过错误提示可知,是由于一些untracked working tree files引起的问题。
所以只要解决了这些untracked的文件就能解决这个问题。
解决方式:
git进入本地版本仓库目录下,直接执行git clean -d -fx
即可。
可能很多人都不明白-d,-fx到底是啥意思,其实git clean -d -fx
表示:删除一些没有 git add 的文件;
|
|
git clone 时显示Filename too long的解决办法
在git bash中,运行下列命令:
git config --global core.longpaths true
就可以解决该问题。
–global是该参数的使用范围,如果只想对本版本库设置该参数,只要在上述命令中去掉–global即可。
切换警告 warning: LF will be replaced by CRLF in
windows中的换行符为 CRLF, 而在linux下的换行符为LF,所以在执行add . 时出现提示,解决办法:
$ git config --global core.autocrlf false //禁用自动转换
Git版本控制大全: