1. 创建仓库
git init
初次创建需要先把所有的文件先 git add -A
,添加到缓存区,然后 git commit -m "init commit"
提交到本地仓库,之后就可以随心所欲创建分支。
2. 版本
$ git version
git version 2.16.0.windows.2
复制代码
3. 暂存区
-
简单查看
$ git status -s M a A "\345\267\245\344\275\234\346\270\205\345\215\225.txt" 复制代码
- M 代表 Modify,修改,后面跟着的是文件 a,
- A , Add,新增,后面跟着的是文件.txt,还有一个
- D ,Delete,删除
- ?? 新增的文件,未添加到缓存区
-
详细查看
$ git status On branch master Changes to be committed: (use "git reset HEAD <file>..." to unstage) new file: "\345\267\245\344\275\234\346\270\205\345\215\225.txt" Changes not staged for commit: (use "git add <file>..." to update what will be committed) (use "git checkout -- <file>..." to discard changes in working directory) modified: a 复制代码
-
添加新文件到暂存区
git add "工作清单.txt"
git add (文件A) (文件B)...
git add .
,git add -A
,git add --all
添加所有的文件 -
查看不同
- 尚未缓存的改动:
git diff
- 查看已缓存的改动:
git diff --cached
- 查看已缓存的与未缓存的所有改动:
git diff HEAD
,git diff HEAD (文件名)
- 显示摘要而非整个diff:
git diff --stat
- 尚未缓存的改动:
-
取消已经缓存的内容
git reset HEAD (文件名)
4. 本地库
-
提交到本地库
git commit -m '第一次版本提交'
-
如果你没有设置 -m 选项,Git 会尝试为你打开一个编辑器以填写提交信息。
git log -1
查看最新的提交信息: -
回滚提交
git reset --hard f4f7dae5f1b48a05afed1d54160e1f28329083b8
回滚提交到 f4f7dae5f1b48a05afed1d54160e1f28329083b8,并且抛弃这里提交之前所有的提交
-
切换到某次提交
git checkout f4f7dae5f1b48a05afed1d54160e1f28329083b8
切换只是切换Head指针,并不会回滚提交,更不会抛弃提交。
5. 远程仓库
-
本地要先生成对应的公钥私钥。
ssh-keygen -t rsa -C "youremail@example.com"
cd ~/.ssh
找到里面的 id_rsa,复制里面的 key 到远程库中
测试:
$ ssh -T git@github.com Hi ChestnutPlus! You've successfully authenticated, but GitHub does not provide shell access. 复制代码
-
查看远程仓库
git remote
-
添加一个远程仓库
git remote add [name] [url]
-
删除指定的远程
git remote rm [name]
-
从远程仓库中抓取
git fetch [remote-name]
:这个命令会访问远程仓库,从中拉取所有你还没有的数据。 执行完成后,你将会拥有那个远程仓库中所有分支的引用,可以随时合并或查看。它并不会自动合并或修改你当前的工作。当准备好时你必须手动将其合并入你的工作。
6. 分支
-
查看分支
$ git branch branchA * master 复制代码
分支后面有星号*的代表是当前的分支
-
新建分支
git branch (branchName)
-
切换分支
git checkout (branchname)
:当你切换分支的时候,Git 会用该分支的最后提交的快照替换你的工作目录的内容git checkout -b (branchname)
:创建新分支并立即切换到该分支下 -
删除分支
git branch -d (branchname)
-
分支合并
git merge (branchname)
合并(branchname)到当前分支中 -
合并冲突
$ git merge branchA Auto-merging a CONFLICT (content): Merge conflict in a Automatic merge failed; fix conflicts and then commit the result. 复制代码
当有冲突的时候,会提示 Automatic merge failed,我们需要先解决冲突再提交。冲突的文件提示在输出里面,我们需要对这些文件进行处理冲突。
$ git diff a diff --cc a index c9109a0,b2eabc7..0000000 --- a/a +++ b/a @@@ -1,4 -1,4 +1,8 @@@ 今天你吃饭没? ++<<<<<<< HEAD +ccccccccccccccccccc ++======= + bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb ++>>>>>>> branchA 复制代码
查看冲突,
git diff (文件)
查看冲突的文件,最底下有写着冲突的地方和所对应的分支。手动打开对应的文件,发现有如下的,然后手动编辑,解决冲突。今天你吃饭没? <<<<<<< HEAD ccccccccccccccccccc ======= bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb >>>>>>> branchA 复制代码
解决完成后,我们需要主动告诉Git我们已经解决好冲突了
$ git status -s UU a $ git add a $ git status -s $ git commit [master 106ee75] Merge branch 'branchA' 复制代码
7. 提交历史
-
查看当前分支的提交历史
git log
git log -10
后面的数字表示查看最新的10条提交 -
可以用 --oneline 选项来查看历史记录的简洁的版本
git log --oneline
-
可以用 --reverse 来逆向查看提交
git log --oneline --reverse
-
查看日志以图形
git log --graph
查看到HEAD的所有提交git log --graph -2
git log --graph --all
查看所有的提交git log --graph --all -2
-
查找特定用户的提交
git log --author=Chestnut --oneline
-
制定日期时间
如果你要指定日期,可以执行几个选项:--since 和 --before,但是你也可以用 --until 和 --after。
git log --oneline --before={1.week.ago} -2
查看1周之前的提交,限制2
git log --oneline --before={1.week.ago} --after={2019-02-18} -5
查看1周之前,且在2-18后的提交,取5个
8. 缓存
-
移除该文件的版本控制,不会删除该文件。
git rm --cached -r 文件名
-
全局忽略文件
git config --list
一堆配置输出,查看是否有 core.excludesfile=/Users/lxy/.gitignore_global,有就打开编辑,把想要忽略的文件编辑上,然后退出。没有这个文件就手动生成。git config --global core.excludesfile "/c/Users/80253144/.ssh/globalGitIgnore"
-
项目自身的忽略文件
直接在对应的.git的相同目录下,新建 .gitignore 文件,里面编辑即可。
问题
1. git 错误 fatal: Not a valid object name: 'master'.
【参考】
初次创建需要先把所有的文件先 git add -A
,添加到缓存区,然后 git commit -m "init commit"
提交到本地仓库,之后就可以随心所欲创建分支。。
2. 记Git报错-refusing to merge unrelated histories
【参考】
一般,我们使用 git fetch
查看更新,然后使用 git merge origin/master
,结果报错:fatal: refusing to merge unrelated histories(拒绝合并不相关的历史)。
出现这个问题的最主要原因还是在于本地仓库和远程仓库实际上是独立的两个仓库。所以,我们用这个命令:git pull origin master --allow-unrelated-historie
3. Git master branch has no upstream branch的解决
【参考】
如上图的分支所示,origin/master 是远程仓库,跟原来本地的仓库是两个独立的仓库,之后我们合并到本地分支上,就变成如上图所示的样子。然后,我们想把 origin/master 合并到 head 去,git push origin
结果报标题的错。git push
时一般会上传到origin下的master分支上,然而当repository和branch过多,而又没有设置关联时,git就会产生疑问,因为它无法判断你的push目标。这里就是远程有一个 master,本地也有一个master,所以我们需要先指定:git push --set-upstream origin master
:
看到最后一句:Branch 'master' set up to track remote branch 'master' from 'origin'.
,分支 master 设置跟踪远程的分支 master。
场景
(1)拉取远程仓库代码到本地
//下载origin仓库的master分支代码
$ git fetch origin master
//比较本地的仓库和远程参考的区别
$ git log -p master.. origin/master
//origin合并到本地仓库master
$ git merge origin/master
复制代码
或者
//从远程的origin仓库的master分支下载到本地并新建一个分支temp
$ git fetch origin master:temp
//比较master分支和temp分支的不同
$ git diff temp
//合并temp分支到master分支
$ git merge temp
//删除temp
$ git branch -d temp
复制代码
查看区别:
//显示出所有有差异的文件列表
git diff origin/master master --stat
//显示指定文件的详细差异
git diff branch1 branch2 <具体文件路径>
//显示出所有有差异的文件的详细差异
git diff branch1 branch2
复制代码
当然,如果有冲突,你就必须要解决冲突,才能合并。
(2)解决冲突
-
git merge origin/master
:尝试合并分支的时候,出现了冲突$ git merge origin/master Auto-merging README.md CONFLICT (content): Merge conflict in README.md Automatic merge failed; fix conflicts and then commit the result. 复制代码
-
git diff README.md
:查看具体的冲突位置:$ git diff README.md diff --cc README.md index 5171bc4,34e6fe1..0000000 --- a/README.md +++ b/README.md @@@ -2,4 -2,6 +2,10 @@@ ++<<<<<<< HEAD +使得开发商;杜可风;斯达康;了 ++======= + TEst使得开发商;杜可风; + + 2019年3月29日12:08:13,我做了修改。 ++>>>>>>> origin/master 复制代码
-
vim README.md
:手动解决冲突 -
解决完成后,我们需要主动告诉Git我们已经解决好冲突了
$ git status -s UU README.md 复制代码
$ git add README.md 复制代码
$ git status -s M README.md 复制代码
$ git commit [master 8dac097] Merge remote-tracking branch 'origin/master' 复制代码
-
把结果告知远程仓库
$ git push origin Counting objects: 6, done. Delta compression using up to 4 threads. Compressing objects: 100% (6/6), done. Writing objects: 100% (6/6), 991 bytes | 495.00 KiB/s, done. Total 6 (delta 0), reused 0 (delta 0) To github.com:ChestnutPlus/GitTest.git 61c3123..2f5987d master -> master 复制代码