git拉取文件分为http和ssh两种方式
FETCH_HEAD: 是一个版本链接,记录在本地的一个文件中,指向着目前已经从远程仓库取下来的分支的末端版本。
commit-id:在每次本地工作完成后,都会做一个git commit 操作来保存当前工作到本地的repo, 此时会产生一个commit-id,这是一个能唯一标识一个版本的序列号。 在使用git push后,这个序列号还会同步到远程仓库。
git pull : 首先,基于本地的FETCH_HEAD记录,比对本地的FETCH_HEAD记录与远程仓库的版本号,然后git fetch 获得当前指向的远程分支的后续版本的数据,然后再利用git merge将其与本地的当前分支合并。所以可以认为git pull是git fetch和git merge两个步骤的结合。
新建一个目录,将其初始化为Git代码库
git init [project-name]
下载一个项目和它的整个代码历史
git clone [url]
Git的设置文件为.gitconfig,它可以在用户主目录下(全局配置),也可以在项目目录下(项目配置)
显示当前的Git配置
git config --list
编辑Git配置文件
git config -e [–global]
设置提交代码时的用户信息
git config [–global] user.name “[name]”
git config [–global] user.email “[email address]”
添加指定文件到暂存区
git add [file1] [file2]…
添加指定目录到暂存区,包括子目录
git add [dir]
添加当前目录的所有文件到暂存区
git add .
删除工作区文件,并且将这次删除放入暂存区
git rm [file1] [file2]…
改名文件,并且将这个改名放入暂存区
git mv [file-original] [file-rename]
提交暂存区到仓库区
git commit -m [message]
提交暂存区的指定文件到仓库区
git commit [file1] [file2] … -m [message]
提交时显示所有diff信息
git commit -v
列出所有本地分支
git branch
列出所有远程分支
git branch -r
新建一个分支,但依然停留在当前分支
git branch [branch-name]
新建一个分支,并切换到该分支
git checkout -b [branch-name]
新建一个分支,指向指定commit
git branch [branch-name] [commit]
切换到指定分支,并更新工作区
git checkout [branch-name]
切换到上一个分支
git checkout -
合并指定分支到当前分支
git merge [branch]
删除分支
git branch -d [branch-name]
删除远程分支
git push origin --delete [branch-name]
git branch -dr [remote/branch]
显示有变更的文件
git status
显示当前分支的版本历史
git log
显示commit历史,以及每次commit发生变更的文件
git log --stat
显示暂存区和工作区的代码差异
git diff
显示指定文件是什么人在什么时间修改过
git blame [filename]
取回远程仓库的变化,并与本地分支合并
git pull [remote] [branch]
上传本地指定分支到远程仓库
git push [remote] [branch]
强行推送当前分支到远程仓库,即使有冲突
git push [remote] --force
推送所有分支到远程仓库
git push [remote] --all
恢复暂存区的指定文件到工作区
git checkout [file]
恢复某个commit的指定文件到暂存区和工作区
git checkout [commit] [file]
恢复暂存区的所有文件到工作区
git checkout .
重置暂存区的指定文件,与上一次commit保持一致,但工作区不变
git reset [file]
暂时将未提交的变化移除,稍后再移入
git stash
git stash pop
重置暂存区与工作区,与上一次commit保持一致
git reset --hard commitID
git push -f -u origin branchName (这样就将远程分支的代码回退了)
生成一个可供发布的压缩包
git archive
把dev分支的代码合并到master分支上
git checkout master
备份master的代码
git pull origin master
合并
git merge dev
再把 master 分支合并到 dev
git checkout dev
git merge master
2、git rebase合并分支
develop分支也是在 (3.added merge.txt file)处从master分支拉取develop分支。不一样的是两个分支各个commit的时间不同,之前develop分支的4和5commit在master分支3之后6之前,现在是develop分支的4提交早于master分支的5提交,develop分支的6提交晚于master的5提交早于master的7提交
在master分支的7commit处,执行git rebase develop,develop分支分出来分叉不见了。
执行git rebase develop之前,HEAD在(6.added hello.txt file)处,当执行rebase操作时,git 会从两个分支的共同祖先 (3.added merge.txt file)开始提取 当前分支(此时是master分支)上的修改,即 (6.added hello.txt file)这个commit,再将 master 分支指向 目标分支的最新提交(此时是develop分支)即(5.added test.txt file) 处,然后将刚刚提取的修改应用到这个最新提交后面。如果提取的修改有多个,那git将依次应用到最新的提交后面
merge结果能够体现出时间线,但是rebase会打乱时间线
再.git文件中的config文件中,头部加上
[user]
email=123@123.com
name=123
就不用填写用户名了
git文件夹下的文件无法添加的问题
git rm -f --cached filepath
删除掉版本控制
git add filepath
重新添加版本控制
3、git拉取远程分支到本地
创建一个空文件夹download,初始化git init, 建立与master的连接 git remote add origin http://github.com:XXXX/nothing2.git
将远程分支拉取到本地git fecth origin dev(分支名称)
在本地创建分支并切换到分支git checkout -b develop(本地分支名称) origin/dev(远程分支名称)
将分支的内容拉取到本地git pull origin dev
git fetch origin dev
指定远程remote和FETCH_HEAD,并且只拉取该分支的提交
与git pull相比git fetch相当于是从远程获取最新版本到本地,但不会自动merge。如果需要有选择的合并git fetch是更好的选择。效果相同时git pull将更为快捷。
git rm -r –cached dirname //删除远程文件夹,但保留本地文件夹
查看项目分支 git branch -a
删除本地分支 git branch -d
4、将本地项目上传到git
git init将目录变成可以管理的仓库
git add .添加目录
git commit -m “first commit” 提交到仓库
git remote add origin 远程仓库地址
git pull --rebase origin master获取本地与远程仓库的合并
git push -u origin master推送本地仓库到远程
git status查询状态
5、git创建分支并推送到远程分支
git checkout -b branchName 创建一个本地分支并切换到该分支
git push origin branchName:remoteName 将本地分支推送到远程分支remoteName是远程分支名称
6、git子模块
当你在一个项目上工作时,你需要在其中使用另外一个项目。也许它是一个第三方开发的库或者是你独立开发和并在多个父项目中使用的。这个场景下一个常见的问题产生了:你想将两个项目单独处理但是又需要在其中一个中使用另外一个。
添加一个子模块
cd blog
git submodule add https://gitcafe.com/aceking/pacman.git themes/pacman
这时需要使用git commit命令和git push命令,将添加模块B为模块A的子模块的结果push到模块A的代码仓库里面去
更新子模块
cd blog
git add ./a 如果没有新增就跳过
git commit -m “new file”
git push origin master
子模块就更新了,还要更新用户的子模块
修改子模块之后只对子模块的版本库产生影响,对父项目的版本库不会产生任何影响,如果父项目需要用到最新的子模块代码,我们需要更新父项目中submodule commit id,默认的我们使用git status就可以看到父项目中submodule commit id已经改变了,我们只需要再次提交就可以了。
git commit -am “modify submodule”
git push origin master
更新子项目的数据,并将父项目指向的子项目的版本号更新
子模块修改后,更新
git submodule foreach git pull
7、版本回退
- 使用git log命令查看所有的历史版本,获取某个历史版本的id
- git reset --hard 139dcfaa558e3276b30b6b2e5cbbb9c00bbdca96
- 把修改推到远程服务器git push -f -u origin master