git学习
- 修改多个提交说明
- 从Git仓库中恢复已删除的分支、文件或丢失的commit
- 执行了git reset,如何取消
- 找回历史版本中删除的文件?
- 强制删除提交到远程版本库的数据与版本记录
- git difftool
- 分支和tag
- 参数--no-ff
- Git 'fatal: No such ref: HEAD'
- 报错:Please move or remove them before you can switch branches.
- git reset/revert
- git fetch/pull
- git ignore
1. http://sumsung753.blog.163.com/blog/static/146364501201301711943864/
2. http://youngsterxyf.github.io/2013/01/08/git-cancel-commits/
3. http://hi.baidu.com/fangqianshu/item/d86fd5df60914c50ddf9be3e
4.http://sumsung753.blog.163.com/blog/static/146364501201312514427364/
5. http://marklodato.github.io/visual-git-guide/index-zh-cn.html http://jwch.sdut.edu.cn/book/tool/git.html
6. http://gitbook.liuhui998.com/4_2.html
7. http://zengrong.net/post/1746.htm
上面的四条命令在工作目录、暂存目录(也叫做索引)和仓库之间复制文件。
git add files把当前文件放入暂存区域。git commit给暂存区域生成快照并提交。git reset -- files用来撤销最后一次git add files,你也可以用git reset撤销所有暂存区域文件。git checkout -- files把文件从暂存区域复制到工作目录,用来丢弃本地修改。
git commit -a相当于运行 git add 把所有当前目录下的文件加入暂存区域再运行。git commit.git commit files进行一次包含最后一次提交加上工作目录中文件快照的提交。并且文件被添加到暂存区域。git checkout HEAD -- files回滚到复制最后一次提交。
git rebase -i HEAD~3
后退n个,合并到前面第n+1个commit中去
git reset --soft HEAD~n or git reset --soft [commit_id]
$ git commit --amend [-m "new message"]
合并commit只能对还未提交的几个commit之间进行,因为如果对远程仓库已经有的commit合并将会遇到head冲突。在push到远程仓库时(比如github),会收到commit冲突提示
2. 从Git仓库中恢复已删除的分支、文件或丢失的commit
执行checkout -f 或 reset -hard 或 branch -d删除一个分支,造成本地(远程)的分支或某些commit丢失,可以通过reflog来进行恢复,前提是丢失的分支或commit信息没有被git gc清除
git reflog show或git log -g #查看所有的操作日志
恢复的过程很简单:
git log -g #通过命令来找到我们需要恢复的信息对应的commit_id
git log --since="2 weeks ago" -- myfile 可以2个星期期间的myfile历史
git log --branches="develop" 可以查看develop的commit
git branch recover_branch[新分支] commit_id
这样,我们就把丢失的东西给恢复到了recover_branch分支上了。
git reflog #查看操作历史,找到之前 HEAD 的 hash 值,
git reset --hard hash(HEAD 的 hash 值) e.g. git reset HEAD@{7}
git checkout [commit_id] -- <path_to_file>
git reset --hard HEAD~2 # 取消当前版本之前的两次提交
git push origin HEAD --force # 强制提交到远程版本库,从而删除之前的两次提交数据
reset命令有3种方式:
git reset –mixed:此为默认方式,不带任何参数的git reset,即时这种方式,它回退到某个版本,只保留源码,回退commit和index信息
git reset –soft:回退到某个版本,只回退了commit的信息,不会恢复到index file一级。如果还要提交,直接commit即可
git reset –hard:彻底回退到某个版本,本地的源码也会变为上一个版本的内容
以下是一些reset的示例:
git reset HEAD^ #回退所有内容到上一个版本
git reset HEAD^ a.py #回退a.py这个文件的版本到上一个版本
git reset –soft HEAD~3 #向前回退到第3个版本
git reset –hard origin/master #将本地的状态回退到和远程的一样
git reset 057d #回退到某个版本
git revert HEAD #回退到上一次提交的状态,按照某一次的commit完全反向的进行一次commit
git diff #显示当前所有文件和最近一次commit版本的内容差异;
git diff [version] #显示当前所有文件和version版本的内容差异;
git diff [version1]..[version2] #显示[version1]版本和[version2]版本的所有文件的内容差异;
git diff FILE #显示当前指定FILE和最近一次commit版本的内容差异;
git diff [version] FILE #显示当前指定FILE和version版本的内容差异;
git diff [version1]..[version2] FILE #显示[version1]版本和[version2]版本的指定FILE文件的内容差异;
查看远程分支
git branch -a #加上-a参数可以查看远程分支,远程分支会用红色表示出来
删除远程分支
git push origin --delete <branchName>
git push origin :<branchName>
删除远程tag
git push origin--delete tag<tagname>
重命名远程分支 先删除远程分支,然后重命名本地分支,再重新提交一个远程分支
git branch -av
git push --delete origin devel #删除远程分支
git br -m devel develop #重命名本地分支
git push origin develop #推送本地分支
把本地tag推送到远程
git push --tags
删除不存在对应远程分支的本地分支
假设这样一种情况:
- 我创建了本地分支b1并pull到远程分支
origin/b1; - 其他人在本地使用fetch或pull创建了本地的b1分支;
- 我删除了
origin/b1远程分支; - 其他人再次执行fetch或者pull并不会删除这个他们本地的
b1分支,运行git branch -a也不能看出这个branch被删除了,如何处理?
git remote show origin #查看b1的状态git remote prune origin#可以将其从本地版本库中去除
更简单的方法是使用这个命令,它在fetch之后删除掉没有与远程分支对应的本地分支:
git fetch -p
--no-ff,即not fast forward,其作用是:要求git merge即使在fast forward条件下也要产生一个新的merge commit)(此处,要求采用--no-ff的方式进行分支合并,其目的在于,希望保持原有“Feature branches”整个提交链的完整性

9. Git 'fatal: No such ref: HEAD'
echo ref: refs/heads/master >.git/HEAD
My-MacBook-Pro:webapp marcamillion$ git checkout develop error: The following untracked working tree files would be overwritten by checkout: public/system/images/9/thumb/red-stripe.jpg public/system/images/9/original/red-stripe.jpg public/system/images/8/thumb/red-stripe-red.jpg public/system/images/8/original/red-stripe-red.jpg Please move or remove them before you can switch branches. Aborting
解决方法:
git clean -d -fx ""
it will delete untracked files
-x means ignored files are also removed as well as files unknown to git.
-d means remove untracked directories in addition to untracked files.
-f is required to force it to run.
git reset -soft :取消了commit
git reset -mixed(默认) :取消了commit ,取消了add
git reset -hard :取消了commit ,取消了add,取消源文件修改
git revert与git reset最大的不同是,git revert 仅仅是撤销某次提交。
比如git revert HEAD~1 ,那么会撤销倒数第二次的提交结果。而倒数第一次的提交记录,仍然在。
如果git reset –hard HEAD~1,那么,commit退回到倒数第三次的状态中。
git fetch:相当于是从远程获取最新版本到本地,不会自动merge
git fetch origin master git log -p master..origin/master git merge origin/master
git pull:相当于是从远程获取最新版本并merge到本地
git pull origin master
13. Ignore files that have already been committed to a Git repository
链接:http://stackoverflow.com/questions/1139762/ignore-files-that-have-already-been-committed-to-a-git-repository
To untrack a single file that has already been added/initialized to your repository, i.e., stop tracking the file but not delete it from your system use: git rm --cached filename To untrack every file that is now in your .gitignore: First commit any outstanding code changes, and then, run this command: git rm -r --cached . This removes any changed files from the index(staging area), then just run: git add . Commit it: git commit -m ".gitignore is now working"

浙公网安备 33010602011771号