配置user
信息
-
配置user.name
git config --global user.name 'your_name'
-
配置user.email
git config --global user.email 'your_email'
-
查看所有配置信息,缺省等同于local
-
git config --local -l
只对某个仓库有效
-
git config --global -l
对当前用户所有仓库有效
-
git config --system -l
对系统所有登录的用户有效
-
git config 属性名
查看某一项配置 如:git config user.name
创建Git仓库
- 把已有的项目代码纳入
Git
管理
- 新建的项目直接用
Git
管理
-
cd
某个文件夹
-
git init your_project
会在当前路径下创建和项目名称同名的文件夹
cd your_project
提交文件
-
git status
查看当前状态,可以看到有哪些文件需要修改
-
git add file_name
将工作目录下的某个文件添加到暂存区中
-
git add --all
git add .
将工作目录下的所有文件添加到暂存区中
-
git commit -m'statement'
将暂存区的文件提交到版本历史中,statement
为备注,-m
及之后的内容可要可不要。
-
git commit -am'statement'
可以不经过暂存区,直接将工作目录中的文件提交到版本历史中(不推荐)。
-
git commit --amend
对最近一次commit
的message
(上面的statement
)做变更
修改工作目录的文件名
直接手动修改工作目录下的文件名时,在git
里会出现先delete
再add
的记录,通过以下命令快速修改并且不需要手动再add
。
git mv old_file_name new_file_name
HEAD和branch
-
HEAD
:头指针,一般指针当前分支(分离头指针状态下不指向任何分支)。
-
git branch -v
查看本地所有的分支, -v
可以省略不写(查看分支时*
指向当前所在的分支)
-
git branch -a
查看所有本地和远程分支
-
git branch -r
查看所有的远程分支
-
git branch -vv
查看本地分支与远程分支的联系
-
git branch branch_name
创建一个新分支,但是不会自动切换到该分支上
-
git checkout branch_name
切换到某个分支上
-
git checkout -b branch_name
在当前分支基础上创建一个新分支,并切换到该分支上
-
git checkout -b branch_name1 branch_name2
在branch_name2的基础创建一个新分支并切换到该分支上
-
git branch -m old_branch_name new_branch_name
修改分支名
-
git push origin --delete origin_branch_name
删除一个远程分支
-
git merge branch_name
将branch_name
分支合并到当前分支
-
git branch -d branch_name
删除某个分支,如果该分支的提交未被保存到其他分支上,会提示错误信息
如果确实不想要该分支上的内容的话,可以使用git branch -D branch_name
强制删除该分支。
通过git log
查看版本演变历史
-
git log
查看所有的提交记录,q
键退出查看log
。
- 在
git log
之后添加下面参数(每次可添加多个,顺序任意)
-
-n1
(n
可以省略)查看最近提交的一次记录,改变数字可以查看不同数量的提交记录。
-
--onelie
每次提交的记录只显示一行
-
--graph
用图形的形式显示提交记录,最好和--oneline
参数一起使用
-
--all
查看所有分支的提交历史
查看hash
值对应的object
类型和内容
-
find .git/objects -type p
查看该项目版本历史中创建的所有对象
-
git cat-file -t hash_value
查看对应hash
值的对象类型,如commit
、tree
(文件夹,文件夹下面可以有文件夹和文件)、blob
(文件)
-
git cat-file -p hash_value
查看对应hash
值的内容,如果当前hash
值为commit
类型,则显示该commit
的相关信息
- 如果
hash
值为tree
类型则可以查看该tree
下面所有的tree
和blob
(如果文件的内容相同,不管文件名是否相同,hash
值均相同,为了节省空间)
- 如果
hash
值为blob
类型,使用该命令可以查看文件的内容(有些二进制格式存储的文件不能查看,如图片)
分离头指针
使用git checkout commit_hash
切换到某一次commit
历史的时候,这个时候不属于任何分支(HEAD
指针没有指向任何分支),所以叫分离头指针状态(detached HEAD state)
在此状态下,可以像正常情况下在该commit
的基础上做各种修改,如果不想保存的话,直接切换到任意分支即可,git
在之后很可能会将此状态下的东西当做垃圾清理掉。所以想保存修改的话,可以将此次修改绑定到一个新的分支上即可,一般没有绑定而直接切换到其他分支的时候,git
也会提醒我们。
让暂存区恢复成HEAD
-
git reset HEAD
恢复所有的文件
-
git reset HEAD file_name
恢复某个文件
让工作区的文件恢复为回暂存区的状态
git checkout -- file_name
恢复到之前的某次提交时的状态
git reset --hard commit_hash
这样会丢失此次提交之后的commit
,谨慎使用
git reset --soft commit_hash
不会丢失此次提交之后的commit
比较不同分支或不同提交的差异
git diff HEAD HEAD~n
比较此次提交和第前n次提交的差别
git diff branch_name1 branch_name2
比较分支1和分支2的差异
git diff commit_hash1 commit hash2
比较提交1和提交2 的差异
如果想知道具体某个文件的差异 ,可以加上 -- file_name
删除文件
git rm file_name
删除文件并将此次操作提交到暂存区
保存当前修改,做其他操作,然后再继续此次操作
git stash
git stash list
查看栈中保存了哪些状态
git stash apply
回到栈顶的状态
git stash pop
回到栈顶的状态并将栈顶出栈
配置公私钥
ssh-keygen -t rsa -b 4096 -C "your_email@example.com"
输入后一路回车。然后在C:\Users\user\.ssh
下可以看见:
然后将公钥的内容复制粘贴到Github
或你需要连接的服务器上
将本地与远端建立起连接
git remote add origin ssh_url
建立连接,并将远程库取名为origin
git push origin --all
将本地所有分支都push
到远程库,可以会出现冲突
git push origin branch_name
将本地当前分支推送到远程库某个分支,可以会出现冲突
将本地分支push到远端时,本地分支和远程出现冲突
git fetch ssh_url branch_name
先将远端分支拉到本地,ssh_url
可以替换为https_url
git merge --allow-unrelated-histories origin/branch_name
将本地分支与拉下来的远程分支进行merge
,因为此时这两个分支没有任何关联,所以需要加上--allow-unrelated-histories
git push origin branch_name
最后再将此分支推送到远程库
不同人修改了同一分支的不同文件(或同一文件的不同区域),推送失败如何处理
git push
后发现被拒绝
-
-
git fetch <远程主机名>
将远程主机上所有分支的更新拉取到本地
-
git fetch <远程主机名> <分支名>
将远程主机上的某个分支拉取到本地
-
fetch
完会返回一个FETCH_HEAD
指针 ,指的是某个branch
在服务器上的最新状态
- 拉取完成后,通过
git merge FETCH_HEAD
将拉取的分支合并到当前分支
-
-
git pull
相当于将1
中多个步骤合并为一个步骤,1
中的fetch
步骤可以先拉取到本地,然后用户可以再检查了以后决定是否合并(merge
)到工作本机分支中
不同人修改了同一分支的同一区域,推送时如何处理
-
git push
后发现被拒绝
-
git pull
拉取最新代码发现出现冲突
打开出现冲突的文件,选择需要保存的内容,删掉git帮我们区分的信息(<<<<HEAD
,======
, >>>>64xx
)
然后将此文件add
之后再commit
,从而解决了冲突问题。
其他人修改了同一分支某个文件的文件名和文件内容,而我们也修改了此文件的内容,推送时如何处理
开出现冲突的文件,选择需要保存的内容,删掉git帮我们区分的信息(<<<<HEAD
,======
, >>>>64xx
)
然后将此文件add
之后再commit
,从而解决了冲突问题。
其他人修改了同一分支某个文件的文件名和文件内容,而我们也修改了此文件的内容,推送时如何处理
直接git pull
,git
会非常智能的帮我们合并