配置user信息
-
配置
user.namegit config --global user.name 'your_name'
-
配置
user.emailgit 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管理-
cd项目代码所在的文件夹 git init
-
- 新建的项目直接用
Git管理-
cd某个文件夹 -
git init your_project会在当前路径下创建和项目名称同名的文件夹 cd your_project
-
提交文件
-
git status查看当前状态,可以看到有哪些文件需要修改 -
git add file_name将工作目录下的某个文件添加到暂存区中 -
git add --allgit 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-****** -t rsa -b 4096 -C "[email protected]" 输入后一路回车。然后在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会非常智能的帮我们合并