Git 使用常见问题

[TOC]

1. 如何使用Git导出项目

Git没有SVN的导出功能,不能像 svn export url 那样,将某个版本的代码导出为不带版本控制文件的文件夹。

Git提供了archive命令,可以把版本的文件流导出。

可以将Git的特征值加入到导出的文件名中,例如:

git archive –format zip -o site-$(git log –pretty=format:”%h” -1).zip HEAD

对于打过tag的历史版本,我们可以使用tag导出,例如:

git archive v1.0 | gzip > xxxx.tgz

2. 提交时忽略某些更改

对于没有入库的文件

命令:touch .gitignore
创建.gitignore文件
在文件中写入需要忽略的文件(如:*.diff ……具体见链接),或者不遵循忽略原则的特例(文件前加“!”)(注:只对untracked files有效)

对于已入库的文件

命令:Git update-index –assume-unchanged FILENAME 路径+文件名
若以后不想忽略该文件的修改,则输入命令:git update-index –no-assume-unchanged FILENAME

查看那些文件被设置了忽略 git ls-files -v | grep ‘^h’

3. 同步从Github上Fork的项目

1、首先克隆项目到本地

1
git clone https://github.com/project

2、添加原作者项目的remote地址,将代码获取到本地

1
2
git remote add source https://github.com/project
git fetch source

source 相当于一个别名

3、合并代码

1
2
git checkout master
git merge source/master

这时如果没有冲突,本地代码已经和远程原作者项目一样了,可以把代码提交到自己的Github库。

4. 如何修改Git配置文件

1、增加配置

1
git config --global --add configName configValue

2、删除配置

1
git config --global --unset configName

3、修改配置

1
git config --global configName configValue

4、查看配置

1
2
git config --global --list
git config --global user.name

5. Git卡死的情况

有的时候提交或者拉取的时候,出现长时间没有响应的情况。

1
2
3
4
5
6
7
$ git gc
$ git fsck
$ git gc --prune=now

# 可以尝试这两个参数
git config --global sendpack.sideband false
git config --global http.postBuffer 524288000

6. 如何解决conflict冲突


Git做任何修改之前,最好先 git pull。


如果提交的时候遇到Automatic merge failed; fix conflicts and then commit the result.则表示有无法自动合并的冲突,需要手工处理。

其中<<<<<<< HEAD 到 ======= 中间的内容是local提交的。
======= 到 >>>>>>> commit-id 是远程仓库中的内容。

手工解决文件中的冲突后,重新git add 并且 git commit

最后再进行git push这时远程仓库的内容就已经更新了。

如果在执行 git pull的时候,本地也已经做过修改,可能会出现下面的提示

1
2
3
4
5
6
$ git pull
Updating 5b4e169..2e2b4a5
error: Your local changes to the following files would be overwritten by merge:
java/spark-1-simpleApp/src/main/java/SimpleApp.java
Please commit your changes or stash them before you merge.
Aborting

此时可通过下面的步骤即实现内容的更新,又保留自己本地的修改。

1
2
3
$ git stash
$ git pull
$ git stash pop

7. 如何从版本库中移除文件但不删除

1
2
3
4
$  git rm -r node_modules --cached
$ git commit -m "remove node_modules"
$ git status
$ git push origin master

8. 查看某次提交的内容

1
git show 6edc4bdcc1c966dc07cb5649f3be6a125ff01d4a [file]  

9. 回退本地修改内容,使用服务器端版本

未使用git add缓存代码的情况

1
$ git checkout -- filename

放弃所有文件的修改

1
$ git checkout .

此命令会将整个内容修改删除,但是不会删除新建的文件,因为新建的文件还没有加入到git管理体系中。

已使用git add但是未git commit的情况

1
$ git reset HEAD filename

放弃所有文件修改

1
$ git reset HEAD

此命令用来清除 git 对于文件修改的缓存。相当于撤销 git add 命令所在的工作。在使用本命令后,本地的修改并不会消失,而是回到了第一步1. 未使用git add 缓存代码,继续使用用git checkout – filename,就可以放弃本地修改

已经git commit提交的情况

回退到上一次commit的状态

1
$ git reset --hard HEAD^

回退到任意版本

1
$ git reset --hard commit id

10. 创建分支

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# 查看当前本地分支
$ git branch -a
* master
remotes/origin/HEAD -> origin/master
remotes/origin/master
# 查看远程分支
$ git branch -r
origin/HEAD -> origin/master
origin/master
# 创建本地分支并切换到分支
$ git branch v0.0.1
$ git checkout v0.0.1
# 将本地分支内容推送到 Github
$ git push origin v0.0.1

11. 使用Token方式提交

参考资料:

  1. 用Git导出项目
  2. Git如何导出历史版本
  3. 同步Github上Fork的代码
  4. Git修改配置文件
  5. Git pull push 卡死解决办法
  6. 【Git】git使用 - 冲突conflict的解决演示
  7. 从git版本库中移出文件但不删除
  8. Git 查看某次commit的内容
  9. Git出现冲突error: Your local changes to the following files would be overwritten by merge: xxx/…
  10. git放弃本地文件修改

cocowool

A FULL STACK DREAMER!