git学习

参考

git 基本用法

 参考

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 基本用法

上面的四条命令在工作目录、暂存目录(也叫做索引)和仓库之间复制文件。

  • 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 回滚到复制最后一次提交。

 

1.修改多个提交说明

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  #查看所有的操作日志

恢复的过程很简单:

  • 1. 找到我们需要恢复的信息对应的commit_id
git log -g #通过命令来找到我们需要恢复的信息对应的commit_id
git log --since="2 weeks ago" -- myfile 可以2个星期期间的myfile历史
git log --branches="develop" 可以查看develop的commit
  • 2. 建立一个新的分支
git branch recover_branch[新分支] commit_id

  这样,我们就把丢失的东西给恢复到了recover_branch分支上了。

 

3.执行了git reset,如何取消

git reflog #查看操作历史,找到之前 HEAD 的 hash 值,
git reset --hard hash(HEAD 的 hash 值)  e.g. git reset HEAD@{7}

4. 找回历史版本中删除的文件?

git checkout [commit_id] -- <path_to_file>

5. 强制删除提交到远程版本库的数据与版本记录

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 

 

 6. git difftool

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文件的内容差异;

 

 

7.分支和tag

查看远程分支

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

删除不存在对应远程分支的本地分支

假设这样一种情况:

  1. 我创建了本地分支b1并pull到远程分支 origin/b1
  2. 其他人在本地使用fetch或pull创建了本地的b1分支;
  3. 我删除了 origin/b1 远程分支;
  4. 其他人再次执行fetch或者pull并不会删除这个他们本地的 b1 分支,运行 git branch -a 也不能看出这个branch被删除了,如何处理?
git remote show origin #查看b1的状态
git remote prune origin #可以将其从本地版本库中去除

更简单的方法是使用这个命令,它在fetch之后删除掉没有与远程分支对应的本地分支:

git fetch -p

 

 8. 参数--no-ff

--no-ff,即not fast forward,其作用是:要求git merge即使在fast forward条件下也要产生一个新的merge commit)(此处,要求采用--no-ff的方式进行分支合并,其目的在于,希望保持原有“Feature branches”整个提交链的完整性

 

http://pic004.cnblogs.com/news/201202/20120222_112349_4.jpg

 

9. Git 'fatal: No such ref: HEAD'

echo ref: refs/heads/master >.git/HEAD

10.报错:

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.

 

 11.git reset/revert

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退回到倒数第三次的状态中。

 

12. git fetch&git pull

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"

 

posted @ 2014-04-18 20:50  blue_whale  阅读(361)  评论(0)    收藏  举报